2009-07-23 64 views
0

例如,如果这个码被包含在一个叫做some_module蟒命名空间层次结构上述目的

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

然后printNamespaceAbove将被定义,使得该代码将输出像

[some_module,C,C2,g] 

回答

2

有没有办法让代码如上所述,有任何输出 - g的主体(包括你想要打印的装饰器)不会执行直到g被调用。我假设你并不是真的打算单独输出“this code”来输出任何内容,而是打算添加一个诸如C.C2()。g()这样的调用,这将实际上完成输出。

有没有真正做到这一点非常有效的方式 - 你(当然,装饰;-)必须在模块级(您可以通过f的全局识别开始,装饰的说法:它的名字是f.func_globals['__name__']并通过它的名字你可以在sys.modules中查找它),那么你必须沿着每一个可能的名字链,直到你找到你的调用函数(例如通过标准库中的inspect模块)。还要注意,嵌套函数在几个角落案例中特别令人头疼。