Python函数和装饰器(包装器)中的括号

2024-10-03 09:11:28 发布

您现在位置:Python中文网/ 问答频道 /正文

谢谢你读我的问题。由于我对Python还不熟悉,我想问一下Python中的()的情况。在

def addOne(myFunc):
    def addOneInside():
        return myFunc() + 1
    return addOneInside # <-----here is the question

@addOne
def oldFunc():
    return 3

print oldFunc()

请注意,在第四行,虽然程序返回一个函数,但它不需要括号()。为什么它没有出现语法错误的错误呢?非常感谢您事先的回答!在


Tags: the函数程序returnhereisdef情况
2条回答

圆括号是用来运行函数的,但是没有它们,名称仍然像变量一样引用函数。在

return myFunc() + 1

这将计算myFunc函数,将1加到它的值上,然后返回该值。为了使函数运行并返回一个数值,需要括号。在

^{pr2}$

这实际上并不是在运行addOneInside,它只是将函数作为变量返回。您可以将其指定给另一个名称,并将其存储以供以后使用。理论上你可以这样做:

plusOne = addOneInside
plusOne()

它实际上会调用addOneInside函数。在

初始问题中的特定实例称为Decorator,它是一种对传递给函数的参数执行代码的方法。您的示例不太实用,但我可以修改它以显示一个简单的用例。在

假设您只希望将正数传递给函数。如果传递给myFunc一个负数,则需要将其更改为0。你可以用这样的装饰工来处理。在

def addOne(myFunc):
    def addOneInside(num):
        if num < 0:
            num = 0
        return myFunc(num)
    return addOneInside # <  -here is the question

@addOne
def oldFunc(number):
    return number

为了解释,@addOne是装饰语法,它附加了addOneInside函数,以便在调用{}的参数时调用它。下面是一些输出示例:

oldFunc(-12)
>>> 0
oldFunc(12)
>>> 12

所以现在可以向oldFunc添加独立于参数解析逻辑的逻辑。您还可以相对容易地更改允许的参数。可能还有一个要达到的最大上限,或者您希望它记录下来,或者注意该值不应为负。您还可以将这个decorator应用于多个函数,它将对所有函数执行相同的操作。在

This blogpost为我解释了很多,所以如果这些信息太简短而不清楚,请尝试阅读那里的详细解释。在

您在函数addOne()中的缩进不正确(我已经修复了),但我不认为这是您的问题。在

如果您使用的是Python3,那么print是一个函数,必须这样调用:

print(oldFunc())

相关问题 更多 >