【发布时间】:2015-12-10 14:49:39
【问题描述】:
我试图在这里找到答案,但找不到。
@obj.func # works
@obj.func(**kwargs) #works
@obj.func1(**kwargs).func2 #-> syntax error
我不明白为什么第三种形式是 SyntaxError,对我来说这似乎没有违反任何 python 语法,而且我很清楚用户想要做什么(参见下面的示例)。
我查看了装饰器实现的pep 0318,但没有找到任何答案。
下面是一个使用示例:
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
你可以使用 ItemFunc 作为装饰器:
@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
但是为什么禁止使用以下“快捷语法”:
@redcross.copy(color="blue").caller
def plot_data2(**kwargs):
pass
但我可以:
@redcross.copy_and_decorate(color="blue")
def plot_data2(**kwargs):
pass
第一种形式看起来更好,至少我更了解背后的意图。
【问题讨论】:
标签: python class attributes decorator python-decorators