【问题标题】:Possible to call single-parameter Python function without using parentheses?可以在不使用括号的情况下调用单参数 Python 函数吗?
【发布时间】:2010-05-28 22:23:13
【问题描述】:

Python 文档规定,如果函数只接受一个参数,则省略括号是合法的,但是

myfunction "Hello!"

产生语法错误。那么,有什么关系呢?

编辑:

我阅读的声明仅适用于generator expressions

只有一个参数的调用可以省略括号。

【问题讨论】:

  • 你确定吗?你能告诉我们你在哪里读到这条规则吗?你对红宝石感到困惑吗?
  • 您可能将 Python 与 Ruby 或 Lua 混淆了,其中的括号有时可以省略。
  • @Jen:他们谈论的是表示生成器的括号,而不是函数调用。
  • 有些 Python 单词是语句,有些是函数,这让初学者感到困惑,尤其是当它们在版本之间移动时。
  • IPython (ipython.scipy.org/moin) 交互式解释器可以省略括号,但python 解释器只允许关键字 (docs.python.org/reference/lexical_analysis.html#keywords) 使用此功能

标签: python syntax


【解决方案1】:

供您编辑:

如果你写下一个生成器表达式,比如stuff = (f(x) for x in items),你需要括号,就像你需要[ .. ] 围绕一个列表推导式一样。

但是,当您将某些内容从生成器表达式传递给函数时(这是一种非常常见的模式,因为这几乎是生成器背后的重要思想),那么您不需要两组括号 - 而不是像 @987654323 这样的括号@(外括号表示函数调用,内括号表示生成器表达式)你可以写sum(f(x) for x in items)

【讨论】:

    【解决方案2】:

    您可以使用 IPython 来实现 - %autocall magic command 控制此功能(以及 -autocall 命令行选项)。使用%autocall 0 禁用该功能,默认使用%autocall 1 使其仅在存在参数时才起作用,使用%autocall 2 使其即使对于无参数的可调用对象也起作用。

    In [2]: %autocall 1
    Automatic calling is: Smart
    
    In [3]: int '5'
    ------> int('5')
    Out[3]: 5
    
    In [4]: %autocall 2
    Automatic calling is: Full
    
    In [5]: int
    ------> int()
    Out[5]: 0
    

    【讨论】:

      【解决方案3】:

      如果没有括号,则不是functions,而是statementskeywords(语言内在)。

      This StackOverflow thread(有一些非常好的答案)contains a lead as 如何在纯 Python 中创建自己的(通过高级黑客技术,在 99.99% 的情况下这不是一个好主意)。

      【讨论】:

        【解决方案4】:

        据我了解,该规则仅与生成器表达式有关... 比如:

        sum(x**2 for x in range(10))
        

        但你还是得写:

        reduce(operator.add, (x**2 for x in range(10)))
        

        但这不适用于泛型函数。

        【讨论】:

          猜你喜欢
          • 2014-08-18
          • 2011-10-24
          • 2017-07-28
          • 1970-01-01
          • 1970-01-01
          • 2019-11-24
          • 2015-01-06
          • 2018-07-13
          • 2020-05-15
          相关资源
          最近更新 更多