fix "__qualname__" of names defined as 'global'
authorStefan Behnel <stefan_ml@behnel.de>
Thu, 7 Nov 2013 07:06:53 +0000 (08:06 +0100)
committerStefan Behnel <stefan_ml@behnel.de>
Thu, 7 Nov 2013 07:06:53 +0000 (08:06 +0100)
Cython/Compiler/ExprNodes.py
tests/run/cyfunction.pyx

index 7534a37..f51629e 100644 (file)
@@ -6679,11 +6679,13 @@ class ModuleNameMixin(object):
     def set_qualified_name(self, env, self_name):
         self.module_name = env.global_scope().qualified_name
         qualified_name = [self_name]
-        while env and not env.is_module_scope:
-            if env.is_closure_scope:
-                qualified_name.append('<locals>')
-            qualified_name.append(env.name)
-            env = env.parent_scope
+        entry = env.lookup(self_name)
+        if not entry or not (entry.is_pyglobal and not entry.is_pyclass_attr):
+            while env and not env.is_module_scope:
+                if env.is_closure_scope:
+                    qualified_name.append('<locals>')
+                qualified_name.append(env.name)
+                env = env.parent_scope
         self.qualname = StringEncoding.EncodedString('.'.join(qualified_name[::-1]))
 
     def get_py_mod_name(self, code):
index 2bcd8ff..11a0cfc 100644 (file)
@@ -47,24 +47,42 @@ def test_qualname():
 
 def test_nested_qualname():
     """
-    >>> func, lambda_func = test_nested_qualname()
+    >>> func, lambda_func, XYZ = test_nested_qualname()
 
     >>> func().__qualname__
     'test_nested_qualname.<locals>.outer.<locals>.Test'
     >>> func().test.__qualname__
     'test_nested_qualname.<locals>.outer.<locals>.Test.test'
+
+    >>> func()().__qualname__
+    'test_nested_qualname.<locals>.outer.<locals>.Test'
     >>> func()().test.__qualname__
     'test_nested_qualname.<locals>.outer.<locals>.Test.test'
 
+    >>> func()().test().__qualname__
+    'XYZinner'
+    >>> func()().test()().__qualname__
+    'XYZinner'
+
     >>> lambda_func.__qualname__
     'test_nested_qualname.<locals>.<lambda>'
+
+    >>> XYZ.__qualname__
+    'XYZ'
     """
     def outer():
         class Test(object):
             def test(self):
-                return 123
+                global XYZinner
+                class XYZinner(object): pass
+
+                return XYZinner
         return Test
-    return outer, lambda:None
+
+    global XYZ
+    class XYZ(object): pass
+
+    return outer, lambda:None, XYZ
 
 
 def test_doc():