Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将函数应用于self的Pythonic方式、语法或运算符?_Python - Fatal编程技术网

将函数应用于self的Pythonic方式、语法或运算符?

将函数应用于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

假设有一个长的命名或嵌套的函数对象集合/字典,如果我想基于某些条件对其中一些对象应用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中没有内置语法。内置的赋值运算符是

=
+=
-=
*=
/=
%=
//=
**=
&=
|=
^=
>>=
<<=
@=
=
+=
-=
*=
/=
%=
//=
**=
&=
|=
^=
>>=

我认为这不是一个好主意,但类似于你想要的东西是可能的

如果可以修饰所有可调用项,则可以添加此类操作,例如使用
@=
运算符,该运算符通常不为函数定义:

第一步是声明您必须应用于所有可调用项的装饰程序:

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。你想要一个<代码>