[Cython] cython-devel-tests-pyregr regression

Stefan Behnel stefan_ml at behnel.de
Thu Aug 23 06:47:46 CEST 2012


Vitja Makarov, 22.08.2012 22:34:
> 2012/8/23 Stefan Behnel:
>> Vitja Makarov, 22.08.2012 22:11:
>>> I've found regression:
>>>
>>> https://sage.math.washington.edu:8091/hudson/job/cython-devel-tests-pyregr/
>>
>> Interesting. It's a Py2 list comprehension in a class body that's failing here:
>>
>> """
>>  class TestHelpSubparsersOrdering(HelpTestCase):
>>      subparsers_signatures = [Sig(name=name)
>>                               for name in ('a', 'b', 'c', 'd', 'e')]
>>  """
>>
>> I wonder why "name" isn't declared as a variable yet at the point where it
>> is being looked up in the function call.
>
>     def lookup_relative(self, name, pos):
>         if name == "name":
>             print name
>             from ipdb import set_trace; set_trace()
>         entry = self.lookup_here(name)
>         if entry is not None and entry.pos[1:] <= pos[1:]: # Lookup fails here
>             return entry
>         if self.outer_scope:
>             return self.outer_scope.lookup_relative(name, pos)
>         return None
> 
> 
> What is that comparison for?

Ah, yes, it is wrong in this context. It was meant to prevent names defined
further down in the class body from being considered assignments to the
name being looked up. Class bodies are not function bodies, assignments in
them do not make a name "local". As long as it's not assigned, it's not
defined and must be looked up in the outer scope.

I think comprehensions are actually the only case where a name is used in
the source before its declaration. It should work in all other cases.

I had considered solving this problem with the flow control analysis
information, but I can't see how that helps me to figure out if an entry is
already assigned (i.e. declared) at a given point in the class body.

Any idea?

Actually, I even wonder if it is a good idea to look up the name directly
in the class scope - we may want to inject a local comprehension scope
here, as for Py3 comprehensions and genexprs, and just switch the
fall-through of the declarations on or off based on the code semantics.

Stefan



More information about the cython-devel mailing list