【问题标题】:Parentheses in Python's functions and decorators(wrappers)Python 函数和装饰器(包装器)中的括号
【发布时间】:2015-10-09 08:38:07
【问题描述】:

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

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

@addOne
def oldFunc():
    return 3

print oldFunc()

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

【问题讨论】:

  • 缩进。 Python 使用它来确定函数的开始和结束。在addOne 函数内的代码中添加一级缩进。
  • 哪个版本的python?确切的语法错误是什么?
  • 您必须真正向我们展示 Python 向您显示的确切错误。如我所见,Python 2.7 应该一切正常,但我们需要知道 Ptyhon 版本、错误行和错误消息。谢谢
  • 我使用的是 Python 2.7。但是,这不是此问题中的语法错误或其他类型的错误。我只是希望了解更多()的用法!误会请见谅!
  • 等等,它会给你一个语法错误吗? Why does it turn out with an error for syntax error?

标签: python wrapper nested python-decorators


【解决方案1】:

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

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 是装饰器语法,它附加了 addOneInside 函数,以便在您调用它时在 oldFunc 的参数上调用。所以现在这里有一些示例输出:

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

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

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

【讨论】:

  • 感谢详细的解释!但是对于第 1 行 def addOne(myFunc): 为什么我不应该让它 myFunc() ?
  • @Steven 我扩展了我的答案,这是一个非常复杂的话题,我不确定你对 Python 有多熟悉,所以我希望我足够清楚。
  • 非常感谢您的回答!我一定会花时间消化您的答案并阅读您推荐的博文。谢谢你的时间。我现在对这个概念更清楚了 :) 我只是想知道你们专家是如何从头开始学习的?对我有什么建议吗?我是一名心理学专业的学生。
  • @Steven 很高兴为您提供帮助。它涉及到一些古怪的 Python 东西,所以我希望你能全部遵循!
【解决方案2】:

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

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

print(oldFunc())

【讨论】:

  • 当涉及语法错误时,请不要“更正”问题中的代码!
  • @ReyCharles :如果该代码块中实际上存在语法错误,那将是一个有效的观点,但是没有。 print 语句存在潜在的语法错误,该错误已被保留。
  • 感谢您帮助我解决小问题。它可以帮助其他人更清楚地阅读我的问题!
猜你喜欢
  • 2018-03-07
  • 1970-01-01
  • 1970-01-01
  • 2018-10-03
  • 1970-01-01
  • 2020-06-15
  • 2021-05-20
  • 1970-01-01
  • 2017-10-17
相关资源
最近更新 更多