将函数应用于self的Pythonic方式、语法或运算符?
假设有一个长的命名或嵌套的函数对象集合/字典,如果我想基于某些条件对其中一些对象应用decorator,我必须:将函数应用于self的Pythonic方式、语法或运算符?,python,Python,假设有一个长的命名或嵌套的函数对象集合/字典,如果我想基于某些条件对其中一些对象应用decorator,我必须: long\u long\u name[some\u key][some\u other,key]=my\u decorator(long\u long\u name[some\u key][some\u other,key]) 有没有一种类似python的方法/语法?喜欢加等于等于加上自己 a=a+b#可以写成 a+=b a=b(a) A.◯= 像这样的? 不,在Python3.8
long\u long\u name[some\u key][some\u other,key]=my\u decorator(long\u long\u name[some\u key][some\u other,key])
有没有一种类似python的方法/语法?喜欢加等于等于加上自己
a=a+b#可以写成
a+=b
a=b(a)
A.◯= 像这样的?
不,在Python3.8中没有内置语法。内置的赋值运算符是
=
+=
-=
*=
/=
%=
//=
**=
&=
|=
^=
>>=
<<=
@=
=
+=
-=
*=
/=
%=
//=
**=
&=
|=
^=
>>=
我认为这不是一个好主意,但类似于你想要的东西是可能的
如果可以修饰所有可调用项,则可以添加此类操作,例如使用@=
运算符,该运算符通常不为函数定义:
第一步是声明您必须应用于所有可调用项的装饰程序:
class decoratable:
def __init__(self, fn):
self.fn = fn
def __matmul__(self, other):
return decoratable(other(self.fn))
def __call__(self, *args, **kwargs):
return self.fn(*args, **kwargs)
如果使用此装饰器装饰所有可调用项,则可以使用@
将它们与其他装饰器组合:
@decoratable
def add_2(x):
return x + 2
long_long_name = {"some_key": {("other", "key"): add_2}}
让我们定义一个在调用函数时打印的示例装饰器:
def printer(fn):
def wrapper(*args, **kwargs):
print(f"Calling {fn.__name__}")
return fn(*args, **kwargs)
return wrapper
最后,这成为可能:
>>> long_long_name["some_key"]["other", "key"](3)
5
>>> long_long_name["some_key"]["other", "key"] @= printer
>>> long_long_name["some_key"]["other", "key"](3)
Calling add_2
5
decorator语法(@decorator)已经是你最后不得不做的事情的语法糖,但它只适用于def
-ing函数/方法。如果你想在以后应用它(甚至有条件地),你必须坚持你原来的方法,如果函数本身可以在定义过程中被修饰,你可以定义一些语法,比如long\u long\u name[some\u key][some\u other,key]@=my\u decorator
,但我不认为我会认为它是美丽的或者是Python。你想要一个<代码>