gpt4 book ai didi

python - 函数修饰中的函数调用

转载 作者:太空宇宙 更新时间:2023-11-04 09:59:54 24 4
gpt4 key购买 nike

装饰函数的时候可以使用方法@object.method,也可以使用属性的属性方法等等@object.attribute.attribute.method。您还可以将额外的参数传递给装饰器 @function(foo="bar")

但是,这些似乎是冲突的。当链中有函数调用时,python 似乎假定它是您将参数传递给装饰器的位置,并且之后的任何链都是 SyntaxError。

这里有什么我遗漏的吗?这种行为的原因或解决方法?

此代码是为 Python 3.4 编写的。

#!/usr/bin/env python3

class Decorator:
def decorate(self, callback):
return callback

_dec = Decorator()
def findit():
return _dec

class B: dec = _dec
class A: bar = B()
foo = A()

dec = findit()
@dec.decorate
#@findit().decorate
#Above line is a syntax error
@foo.bar.dec.decorate #also permitted
def function():
pass

错误:

  File "test.py", line 17
@findit().decorate
^
SyntaxError: invalid syntax

最佳答案

The grammar装饰器是这样的:

decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE
decorators: decorator+
decorated: decorators (classdef | funcdef | async_funcdef)

这里 dotted_name 是(又名 foofoo.bar.spam 等):

dotted_name: NAME ('.' NAME)*

从语法中可以清楚地看出,括号后面只能跟一个换行符,而不能跟另一个 dotted_name,因此它会引发语法错误。

因此,要解决此问题,请确保函数调用始终在最后,如果中间有函数调用,您必须事先将其分配给变量(仅从您的代码中获取):

dec = findit()
@dec.decorate

有关装饰器语法的历史,您可以阅读此文档:https://wiki.python.org/moin/PythonDecorators

关于python - 函数修饰中的函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44142441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com