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(
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():