2009-07-17 84 views
1

爲什麼這不起作用?我怎樣才能使它工作?也就是說,我怎樣才能讓我的裝飾功能裏的顧客可以訪問?在修飾器中定義功能

def decorate(f): 
    def new_f(): 
     def gu(): 
      pass 
     f() 
    return new_f 

@decorate 
def fu(): 
    gu() 

fu() 

是否需要將gu添加到已定義函數的字典中?或者可以在調用它之前將gu添加到f的本地名稱空間中?

回答

0

原則上,您可以使用相同的代碼與舊創建一個新的功能,但用與全球範圍內修改後的一個:

import new 

def with_bar(func): 
    def bar(x): 
     return x + 1 
    f_globals = func.func_globals.copy() 
    f_globals['bar'] = bar 
    return new.function(func.func_code, f_globals, 
         func.func_name, func.func_defaults, func.func_closure) 

@with_bar 
def foo(x): 
    return bar(x) 

print foo(5) # prints 6 

在實踐中,你真的應該找到一個更好的方法來做到這一點。作爲參數傳遞函數是一種選擇。也可能有其他方法,但很難說沒有高層次的問題描述會適合什麼。

1

合谷是本地new_f功能,這是本地的裝飾功能。

1

gu()僅在new_f()中定義。除非你將它返回或將它錨定到new_f()或其他東西,否則它不能從外部引用new_f()

我不知道你在幹什麼,但是這個方案看起來很複雜。也許你可以找到一個較簡單的解決方案。

+0

這個例子沒有意義,但我試圖給出最簡單的例子來說明問題。應該很清楚我想要做什麼。我想在裝飾器定義中定義一個函數,以便在裝飾函數中使用。 – Alex 2009-07-17 07:56:33

+0

@Alex:您能否提供您正在嘗試解決的更高級別問題的描述?也許有人可以使用完全不同的方法來提出更清晰的解決方案。 – Ber 2009-07-17 09:42:44

2

如果你需要傳遞gufu你需要通過參數明確地做到這一點:

​​3210
0

爲什麼不讓你的裝飾器成爲類而不是函數?這顯然是可能的,正如我在查看內置的property的幫助時發現的那樣。 (以前,我曾以爲你只能將類裝飾器應用到類中,而不是裝飾器本身可以是類。)

(當然,gu必須是類或內部類的方法。 )