“SyntaxError: Missing parentheses in call to 'print'”在 Python 中是啥意思?

Posted

技术标签:

【中文标题】“SyntaxError: Missing parentheses in call to \'print\'”在 Python 中是啥意思?【英文标题】:What does "SyntaxError: Missing parentheses in call to 'print'" mean in Python?“SyntaxError: Missing parentheses in call to 'print'”在 Python 中是什么意思? 【发布时间】:2014-10-16 05:09:07 【问题描述】:

当我尝试在 Python 中使用 print 语句时,它给了我这个错误:

>>> print "Hello, World!"
  File "<stdin>", line 1
    print "Hello, World!"
                        ^
SyntaxError: Missing parentheses in call to 'print'

这是什么意思?

【问题讨论】:

【参考方案1】:

此错误消息表示您正在尝试使用 Python 3 来跟随示例或运行使用 Python 2 print 语句的程序:

print "Hello, World!"

上述语句在 Python 3 中不起作用。在 Python 3 中,您需要在要打印的值周围添加括号:

print("Hello, World!")

“SyntaxError: Missing parentheses in call to 'print'” 是 Python 3.4.2 中添加的新错误消息,主要是为了帮助在运行时尝试遵循 Python 2 教程的用户Python 3。

在 Python 3 中,打印值从一个不同的语句变为一个普通的函数调用,所以它现在需要括号:

>>> print("Hello, World!")
Hello, World!

在 Python 3 的早期版本中,解释器只报告一个通用语法错误,而没有提供任何有用的提示来说明可能出现的问题:

>>> print "Hello, World!"
  File "<stdin>", line 1
    print "Hello, World!"
                        ^
SyntaxError: invalid syntax

至于为什么 print 在 Python 3 中变成了一个普通函数,这与语句的基本形式无关,而是与您如何执行更复杂的事情(例如打印多个项目)有关到 stderr 用尾随空格而不是结束行。

在 Python 2 中:

>>> import sys
>>> print >> sys.stderr, 1, 2, 3,; print >> sys.stderr, 4, 5, 6
1 2 3 4 5 6

在 Python 3 中:

>>> import sys
>>> print(1, 2, 3, file=sys.stderr, end=" "); print(4, 5, 6, file=sys.stderr)
1 2 3 4 5 6

从 2017 年 9 月的 Python 3.6.3 版本开始,一些与 Python 2.x 打印语法相关的错误消息已更新,以推荐其对应的 Python 3.x:

>>> print "Hello!"
  File "<stdin>", line 1
    print "Hello!"
                 ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print("Hello!")?

由于“打印调用中缺少括号”的情况是编译时语法错误,因此可以访问原始源代码,因此它能够在建议的替换中包含该行其余部分的全文。但是,它目前并未尝试计算出适当的引号来围绕该表达式(这并非不可能,只是足够复杂以至于尚未完成)。

为右移运算符提出的TypeError 也已自定义:

>>> print >> sys.stderr
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for >>: 'builtin_function_or_method' and '_io.TextIOWrapper'. Did you mean "print(<message>, file=<output_stream>)"?

由于此错误是在代码运行而不是编译时引发的,因此它无法访问原始源代码,因此在建议中使用元变量(&lt;message&gt;&lt;output_stream&gt;)替换表达式,而不是用户实际键入的任何内容。与语法错误情况不同,在自定义右移错误消息中,可以直接在 Python 表达式周围放置引号。

【讨论】:

感谢@antti-haapala 在顶部添加了直接回答问题的摘要,然后继续对错误消息的来源进行更详细的解释:) 我也将答案切换到了社区 wiki,因为我觉得为此稳步积累更多 SO 代表并不合适(有关错误消息和此 SO 问题如何合作的背景信息,请参阅 bugs.python.org/issue21669 -进化) 您好!我认为这个工具可以帮助某人docs.python.org/2/library/2to3.html 在您的 2.7 文件中添加行 from future import print_function 以将新的 python 3 print() 行添加到您的代码中。因此代码变得兼容 2.7+ 和 3.0+ 如何强制系统使用 Python 2.7 vs 3?也许这是一个适合它的好地方。【参考方案2】:

很遗憾,旧的xkcd comic 不再是最新的了。

从 Python 3.0 开始你必须写:

print("Hello, World!")

还有人要写 antigravity 库:(

【讨论】:

反重力是存在的……你试过导入它吗? ;) AntiGravity Easter Egg【参考方案3】:

从 Python 2 到 Python 3 的语法发生了变化。 在 Python 2 中,

print "Hello, World!" 

可以,但在 Python 3 中,使用括号作为

print("Hello, World!")

这与 Scala 的语法等效,并且接近于 Java。

【讨论】:

只有那些想毁掉一门语言的人才会把语法改变到那种程度。很自然的做法是将两种语法都保留为有效。【参考方案4】:

基本上,从 Python 3.x 开始,您需要使用带括号的 print

Python 2.x:打印“指环王”

Python 3.x:print("指环王")


说明

print2.x中的语句,但它是中的函数 3.x。现在,这有很多很好的理由。

    使用 Python 3.x 的函数格式,在打印多个以逗号分隔的项目时具有更大的灵活性。 您不能在语句中使用参数飞溅。在 3.x 中,如果您有一个要使用分隔符打印的项目列表,您可以这样做:
>>> items = ['foo', 'bar', 'baz']
>>> print(*items, sep='+')
foo+bar+baz
    您不能覆盖语句。如果你想改变 print 的行为,你可以在它是一个函数时这样做,而不是在它是一个语句时。

【讨论】:

【参考方案5】:

如果您的代码应该同时在 Python 2 和 3 中工作,您可以通过在程序开头加载它来实现:

from __future__ import print_function   # If code has to work in Python 2 and 3!

然后就可以用 Python 3 的方式打印了:

print("python")

如果您想在不创建新行的情况下打印某些内容 - 您可以这样做:

for number in range(0, 10):
    print(number, end=', ')

【讨论】:

在 Python3 中对我不起作用,即使使用该导入。代码没有括号。【参考方案6】:

在 Python 3 中,您只能打印为:

print("STRING")

但在 Python 2 中,括号不是必需的。

【讨论】:

【参考方案7】:

我还可以补充一点,我知道Python2.7Python3 之间的语法变化的一切,我的代码正确地写成了print("string"),甚至 print(f"string")...

但经过一段时间的调试后,我意识到我的 bash 脚本正在调用 python,如下所示:

python 文件名.py

默认情况下使用python2.7调用我的python脚本会产生错误。所以我将我的 bash 脚本更改为:

python3 文件名.py

哪个粗略使用python3来运行修复错误的脚本。

【讨论】:

您还可以在文件顶部添加一个 shebang 来说明使用哪个 Python 加载文件【参考方案8】:

除了此处的直接答案之外,还应注意 python 2 和 3 之间的另一个关键区别。official python wiki 涵盖了几乎所有主要区别,并重点关注何时应该使用其中任何一个版本。 This blog post 也很好地解释了当前的 Python 世界以及迁移到 Python 3 的未解之谜。

据我所知,您已经开始学习 Python 语言了。在继续使用 python 3 路线之前,您应该考虑上述文章。您不仅需要更改一些语法,还需要考虑哪些包可供您使用(python 2 的优势)以及可以在代码中进行的潜在优化(python 3 的优势) .

【讨论】:

【参考方案9】:

print('Hello, World!')

您使用的是 python 3,打印时需要括号。

【讨论】:

【参考方案10】:

所以我得到了这个错误

from trp import BoundingBox, Document
File "C:\Users\Kshitij Agarwal\AppData\Roaming\Python\Python39\site-packages\trp\__init__.py", line 31
print ip
      ^ 
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(ip)?

这是一个 Python 包错误,其中使用了 Python2,您可能正在 Python3 上运行它。

一种解决方案可能是将包文件夹中每个文件中的每一行的 Python2 print something 转换为 Python3 print(something),这不是一个好主意?。我的意思是,你可以做到,但仍然有更好的方法。

为了执行相同的任务,Python 中有一个名为 2to3 的包,它将 Python2 脚本转换为 Python3 脚本。要安装它,请在终端中执行?命令..

pip install 2to3

然后将终端中的目录更改为包文件所在的位置,在我的情况下 - C:\Users\Kshitij Agarwal\AppData\Roaming\Python\Python39\site-packages\trp

现在执行命令?

2to3 . -w

,该目录中的所有Python2文件都将转换为Python3

注意:- 上述命令也适用于其他操作系统。只有 Python 包路径会因系统而异。

【讨论】:

以上是关于“SyntaxError: Missing parentheses in call to 'print'”在 Python 中是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章