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

Parentheses in Python's functions and decorators(wrappers)

感谢阅读我的问题。由于我对Python还是个新手,我想问一下Python中的()。

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

@addOne
def oldFunc():
    return 3

print oldFunc()

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

圆括号用于 运行 函数,但没有括号,名称仍然像变量一样引用函数。

return myFunc() + 1

这将计算 myFunc 函数,将其值加 1,然后 return 该值。需要括号才能使函数 运行 和 return 成为一个数值。

return addOneInside

这实际上并不是运行宁addOneInside,它只是return将函数作为变量。您可以将其分配给另一个名称并将其存储以备后用。理论上你可以这样做:

plusOne = addOneInside
plusOne()

它实际上会调用 addOneInside 函数。

您最初问题中的特定实例称为装饰器,它是您对传递给函数的参数执行代码的一种方式。你的例子不是很实用,但我可以修改它来展示一个简单的用例。

假设您只想将正数传递给您的函数。如果 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的argument/s上被调用。所以现在这里有一些示例输出:

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

现在您可以向 oldFunc 添加独立于参数解析逻辑运行的逻辑。您还可以相对轻松地更改允许的参数。也许还有一个最大上限可以达到,或者您希望它记录或注意该值不应该为负数。您还可以将此装饰器应用于多个函数,它会对所有函数执行相同的操作。

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

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

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

print(oldFunc())