2015-07-20 90 views
0

感谢您阅读我的问题。由于我还不熟悉Python,因此我想问一下Python中的()。Python函数和装饰器中的括号(包装)

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

@addOne 
def oldFunc(): 
    return 3 

print oldFunc() 

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

+0

压痕。 Python使用它来确定函数的开始和结束。在addOne函数内添加一级缩进。 – bsa

+2

哪个版本的python?什么是确切的语法错误? – ReyCharles

+0

您必须真正向我们展示Python向您展示的确切错误。正如我所看到的,对于Python 2.7来说,一切都应该正常工作,但是我们需要知道Ptyhon版本的错误行和错误消息。谢谢 – madtyn

回答

2

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

return myFunc() + 1 

这将评估myFunc函数,为其值加1,然后返回该值。括号是为了让函数运行并返回一个数值所需要的。

return addOneInside 

这是不实际运行addOneInside,它仅仅是返回函数的变量。您可以将其分配给其他名称并存储以备后用。你理论上可以这样做:

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是修饰语法,它的连接上参数/ S的,只要你把它oldFunc被称为addOneInside功能。所以,现在这里的一些示例输出:

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

所以,现在你可以添加逻辑来oldFunc是独立操作参数的分析逻辑的。你也可以相对容易地改变允许的参数。也许还有一个最大上限,或者你希望它记录或注意到该值不应该是负值。您也可以将这个装饰器应用于多个功能,并且它们将在所有这些功能上执行相同的操作。

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

+0

感谢您的详细解释!但是对于第1行def addOne(myFunc):为什么我不应该使它成为myFunc()? – JetLag

+0

@Steven我扩展了我的答案,这是一个非常复杂的话题,我不确定你对Python有多熟悉,所以我希望我已经清楚了。 – SuperBiasedMan

+0

我真的很感谢你的回答!我一定会花时间消化你的答案并阅读你推荐的博文。谢谢你的时间。我现在更清楚这个概念:) 我只是想知道你们是如何从头开始学习的?对我有什么建议?我是心理学专业的学生。 – JetLag

0

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

如果使用的是Python3,然后print是一个函数,必须像这样调用:

print(oldFunc()) 
+0

当涉及语法错误时,请不要“纠正”问题中的代码! – ReyCharles

+0

@ReyCharles:如果实际上在该代码块中存在语法错误,那将是一个有效的点,但是,没有。 'print'语句存在潜在的语法错误,并且已经完成。 – mhawke

+0

感谢您帮助我解决小问题。它可以帮助他人更清楚地阅读我的问题! – JetLag