爲什麼這不起作用?我怎樣才能使它工作?也就是說,我怎樣才能讓我的裝飾功能裏的顧客可以訪問?在修飾器中定義功能
def decorate(f):
def new_f():
def gu():
pass
f()
return new_f
@decorate
def fu():
gu()
fu()
是否需要將gu添加到已定義函數的字典中?或者可以在調用它之前將gu添加到f的本地名稱空間中?
爲什麼這不起作用?我怎樣才能使它工作?也就是說,我怎樣才能讓我的裝飾功能裏的顧客可以訪問?在修飾器中定義功能
def decorate(f):
def new_f():
def gu():
pass
f()
return new_f
@decorate
def fu():
gu()
fu()
是否需要將gu添加到已定義函數的字典中?或者可以在調用它之前將gu添加到f的本地名稱空間中?
原則上,您可以使用相同的代碼與舊創建一個新的功能,但用與全球範圍內修改後的一個:
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
在實踐中,你真的應該找到一個更好的方法來做到這一點。作爲參數傳遞函數是一種選擇。也可能有其他方法,但很難說沒有高層次的問題描述會適合什麼。
合谷是本地new_f功能,這是本地的裝飾功能。
gu()僅在new_f()中定義。除非你將它返回或將它錨定到new_f()或其他東西,否則它不能從外部引用new_f()
我不知道你在幹什麼,但是這個方案看起來很複雜。也許你可以找到一個較簡單的解決方案。
如果你需要傳遞gu
到fu
你需要通過參數明確地做到這一點:
爲什麼不讓你的裝飾器成爲類而不是函數?這顯然是可能的,正如我在查看內置的property
的幫助時發現的那樣。 (以前,我曾以爲你只能將類裝飾器應用到類中,而不是裝飾器本身可以是類。)
(當然,gu
必須是類或內部類的方法。 )
這個例子沒有意義,但我試圖給出最簡單的例子來說明問題。應該很清楚我想要做什麼。我想在裝飾器定義中定義一個函數,以便在裝飾函數中使用。 – Alex 2009-07-17 07:56:33
@Alex:您能否提供您正在嘗試解決的更高級別問題的描述?也許有人可以使用完全不同的方法來提出更清晰的解決方案。 – Ber 2009-07-17 09:42:44