Commit 159a3b9a authored by Stefan Behnel's avatar Stefan Behnel

add <locals> to __qualname__ for closures as defined by PEP 3155

parent 502394e7
......@@ -6019,10 +6019,13 @@ class DictItemNode(ExprNode):
class ModuleNameMixin(object):
def set_qualified_name(self, env, self_name):
self.module_name = env.global_scope().qualified_name
prefix = env.qualified_name[len(self.module_name)+1:]
if prefix:
self_name = prefix + '.' + self_name
self.qualname = StringEncoding.EncodedString(self_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
self.qualname = StringEncoding.EncodedString('.'.join(qualified_name[::-1]))
def get_py_mod_name(self, code):
return code.get_py_string_const(
......
......@@ -47,20 +47,24 @@ def test_qualname():
def test_nested_qualname():
"""
>>> func = test_nested_qualname()
>>> func, lambda_func = test_nested_qualname()
>>> func().__qualname__
'test_nested_qualname.outer.Test'
'test_nested_qualname.<locals>.outer.<locals>.Test'
>>> func().test.__qualname__
'test_nested_qualname.outer.Test.test'
'test_nested_qualname.<locals>.outer.<locals>.Test.test'
>>> func()().test.__qualname__
'test_nested_qualname.outer.Test.test'
'test_nested_qualname.<locals>.outer.<locals>.Test.test'
>>> lambda_func.__qualname__
'test_nested_qualname.<locals>.<lambda>'
"""
def outer():
class Test(object):
def test(self):
return 123
return Test
return outer
return outer, lambda:None
def test_doc():
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment