2009-07-23 89 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模塊)。還要注意,嵌套函數在幾個角落案例中特別令人頭疼。