[LLVMdev] Minimum Python Version

Gregory Szorc gregory.szorc at gmail.com
Tue Dec 4 10:39:33 PST 2012


On 12/4/12 1:27 AM, Tobias Grosser wrote:
>> On Mon, Dec 3, 2012 at 7:01 PM, Tobias Grosser <tobias at grosser.es> wrote:
>>> Support for python 3 seems a good thing. What constructs in our code block
>>> the move to python 3?
>> I haven't looked in-depth at this, but just trying to import a couple
>> lit modules I get a lot of syntax errors like:
>>
>>>>> import ShUtil.py
>> Traceback (most recent call last):
>>    File "<stdin>", line 1, in <module>
>>    File "ShUtil.py", line 119
>>      raise ValueError,"Fast path failure: %r != %r" % (res, reference)
>>                      ^
>> SyntaxError: invalid syntax
> Yes, this is 2.x python syntax. To support 3.x you need to change it to:
>
> msg = "Fast path failure: %r != %r" % (res, reference)
> raise ValueError(msg)
>
> This code should now work for 3.x and 2.6. However, it also works
> without any
> problem on python 2.4. It is therefore a good example to show that
> python 3.x support does not always require removing support for older
> python version.
>
There is also the difference for handling exceptions. Python 2.4 and 2.5 
only support "except Exception, e" syntax. Python 2.6 and 2.7 support 
that and "except Exception as e." Python 3.0 and above only support 
"except Exception as e." So, exception handling code that needs to work 
on 2.4/2.5 through 3 needs to be something like:

except Exception:
      e = sys.exc_info[1]

It's ugly.

As I said in the initial message in this thread, supporting Python 3 is 
easier the closer the Python 2 release is to 3.0. There's the big ticket 
language additions, which are nice. But what really sways me are all the 
little bugs in the point releases, especially around Unicode handling. 
e.g. this will fail in all 2.x releases except 2.7.3 (the newest):

     from __future__ import unicode_literals
     ...
     env = dict(os.environ)
     env['FOO'] = 'bar'

     output = subprocess.check_output([command], env=env)

It fails because something in the stdlib is expecting str, not unicode.

When you start supporting 2/3, you find these types of bugs all the time 
when working with older Python releases. The remedy is to target the 
newest and least buggy 2.x release possible.



More information about the llvm-dev mailing list