[Python-3000] interaction between locals, builtins and except clause

Eduardo "EdCrypt" O. Padoan eopadoan at altavix.com
Thu Jul 26 19:27:11 CEST 2007


On 7/26/07, Lisandro Dalcin <dalcinl at gmail.com> wrote:
> Porting to Py3K, I modified a function like the followin, using a
> trick for it working in Py2.x .
>
>     def __iter__(self):
>         if self == _mpi.INFO_NULL:
>             return
>         try:    range = xrange
>         except: pass
>         nkeys = _mpi.info_get_nkeys(self)
>         for nthkey in range(nkeys):
>             yield _mpi.info_get_nthkey(self, nthkey)
>
> However, I've got in my unittests (running with py3k)
>
> ERROR: testPyMethods (__main__.TestInfo)
> ----------------------------------------------------------------------
> Traceback (most recent call last):
>   File "tests/unittest/test_info.py", line 123, in testPyMethods
>     for key in INFO:
>   File "/u/dalcinl/lib/python/mpi4py/MPI.py", line 937, in __iter__
>     for nthkey in range(nkeys):
> UnboundLocalError: local variable 'range' referenced before assignment
>
>
> I am not completelly sure if this is expected (it is, regarding
> implementation, but perhaps not regarding Python as a language),  so
> I post this for your consideration.
>

Python thinnks range is local, because you referenced it, even if an
error ocurred. Use 'global range' at the top of the file.

But, as I understand, you are trying to target both Python 2.x and 3
with the same code, using tricks like this one. I think that, even if
you succeed, the resulting code will be quite unmaintainable.

-- 
EduardoOPadoan (eopadoan->altavix::com)
Bookmarks: http://del.icio.us/edcrypt


More information about the Python-3000 mailing list