python名称空间层次结构上面的对

时间:2009-07-23 17:50:58

标签: python namespaces

例如,如果此代码包含在名为some_module

的模块中
class C:
    class C2:
        def g(self):
            @printNamespaceAbove
            def f():
                pass

然后定义printNamespaceAbove,以便此代码输出类似

的内容
[some_module,C,C2,g]

1 个答案:

答案 0 :(得分:2)

没有办法让这个代码,如所示,有任何输出 - g的主体(包括你想要打印的装饰器)只是 DOES NOT 执行直到g被称为。我假设您并不打算单独使用“此代码”来输出任何内容,而是打算添加一个调用,例如C.C2()。g()[实际上会执行输出]。

实际上并没有一种非常有效的方法 - 你(好吧,装饰者;-)必须从模块级开始(你可以通过f的全局变量来识别装饰者的论点:名称为f.func_globals['__name__'],通过其名称,您可以在sys.modules中查找,然后您必须走下每个可能的名称链,直到找到您的调用函数(例如,通过inspect模块在标准库中)。另请注意,在几个极端情况下,嵌套函数尤其令人头疼。