雖然我知道你不能直接在裝飾器中引用self
,但我想知道是否從args[0]
中解決這個問題是不好的做法。我的直覺是,但我想確定。在裝飾器中使用self是不好的做法嗎?
更具體地說,我正在開發一個API到web服務。大約一半的命令需要傳遞一個令牌,以後可以用它來撤消它。我想要的是將該標記設置爲可選參數,如果沒有提供,則生成一個。生成令牌需要對服務器進行經過驗證的調用,該服務器需要來自該對象的數據。
雖然我知道我能做到這一點:
def some_command(self, ..., undo_token = None):
if undo_token = None:
undo_token = self.get_undo_token()
...
return fnord
我覺得有可能是比有十幾方法相同的代碼更好的辦法。我的想法是寫一個裝飾:
@decorator
def undoable(fn, *args, **kwargs):
if 'undo_token' not in kwargs:
kwargs['undo_token'] = args[0].get_undo_token()
return (fn(*args, **kwargs), kwargs['undo_token'])
所以我可以更清晰地寫
@undoable
def some_command(self, ...):
...
return foo
@undoable
def some_other_command(self, ...):
...
return bar
難道我自己設置了麻煩向下行?
+1使用裝飾模式實現「撤消」。 – 2010-09-02 22:32:56
裝飾器對裝飾函數的參數有要求沒有任何問題;只要確保它被記錄在案。 – 2010-09-02 23:16:02