私はここで答えを見つけようとしましたが、できませんでした。三番目の形式はでSyntaxErrorである理由私は理解していないPythonデコレータ@func()。属性の構文エラー
@obj.funC# works
@obj.func(**kwargs) #works
@obj.func1(**kwargs).func2 #-> syntax error
は、それはそれは任意のPythonの構文に違反していないと、ユーザーが何をしたいのか私には明らかである私のためと思われる(以下の例を参照)。
私はデコレータの実装のpep 0318を見ましたが、何の答えも見つかりませんでした。ここで
怒鳴る、使用例のようになります。これ以下の「ショートカット構文は」禁止されている理由
@ItemFunc
def plot(**kwargs):
pass
redcross = plot.copy(color="red", marker="+")
@redcross.caller
def plot_data1(**kwargs):
pass
bluecross = redcross.copy(color="blue")
@bluecross.caller
def plot_data2(**kwargs):
pass
をしかし:あなたはデコレータとしてItemFuncを使用することができるよりも
class ItemFunc(object):
def __init__(self, fcall=None, **kwargs):
self.defaults = kwargs
self.fcall = None
def __call__(self, *args, **kwargs):
kwargs = dict(self.defaults, **kwargs)
# do something more complex with kwargs
output = self.fcall(*args, **kwargs)
# do something more with output
return output
def caller(self, fcall):
""" set call and return self """
self.call = fcall # after some check obviously
return self
def copy(self,**kwargs):
kwargs = dict(self.defaults, **kwargs)
return self.__class__(self.fcall, **kwargs)
def copy_and_decorate(self, **kwargs):
return self.copy(**kwargs).caller
@redcross.copy(color="blue").caller
def plot_data2(**kwargs):
pass
しかし、私はできる:
@redcross.copy_and_decorate(color="blue")
def plot_data2(**kwargs):
pass
最初の形式はより良いものを探しますが、少なくとも私は後ろの意図をよく理解しています。
ええ、それはもっと哲学的な問題です。 getterや.callerのようなものでデコレータを完成させる私の場合(私の例のように)、最終的に.callerメソッドを送信する関数を呼び出しながら、私たちがやりたいことを明確にしています。読める。あなたは思いませんか? – user3240484
@ user3240484:セットアップでどこに行くのか分かります。属性を使用する代わりに '__call__'が実際のデコレータを返すようにしてください。これは' __call__'もサポートしていますか? –
あなたは正しいですが、私の例を見れば、__call__メソッドはすでにオブジェクトのようにオブジェクトのように 'fcall'関数のデコレータのように動作しています。私は__call__を呼び出し関数で置き換え、__call__を使ってデコレータを返すことができましたが、私がそこで得るものはそこにあります。ありがとう – user3240484