例如,如果此代码包含在名为some_module
的模块中class C:
class C2:
def g(self):
@printNamespaceAbove
def f():
pass
然后定义printNamespaceAbove,以便此代码输出类似
的内容[some_module,C,C2,g]
答案 0 :(得分:2)
没有办法让这个代码,如所示,有任何输出 - g的主体(包括你想要打印的装饰器)只是 DOES NOT 执行直到g被称为。我假设您并不打算单独使用“此代码”来输出任何内容,而是打算添加一个调用,例如C.C2()。g()[实际上会执行输出]。
实际上并没有一种非常有效的方法 - 你(好吧,装饰者;-)必须从模块级开始(你可以通过f
的全局变量来识别装饰者的论点:名称为f.func_globals['__name__']
,通过其名称,您可以在sys.modules
中查找,然后您必须走下每个可能的名称链,直到找到您的调用函数(例如,通过inspect模块在标准库中)。另请注意,在几个极端情况下,嵌套函数尤其令人头疼。