在Python中,“ SyntaxError:调用'print'时缺少括号”是什么意思?


389

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

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

这意味着什么?

Answers:


601

此错误消息表示您尝试使用Python 3遵循示例或运行使用Python 2 print语句的程序:

print "Hello, World!"

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

print("Hello, World!")

“ SyntaxError:对'print'的调用中缺少括号”是Python 3.4.2中新增的一条错误消息,主要是为了帮助试图在运行Python 3时遵循Python 2教程的用户。

在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>)"?

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


3
感谢@ antti-haapala在顶部添加了直接回答问题的摘要,然后继续对错误消息的起源进行更详细的解释:)
ncoghlan,2015年

我也切换答案社区维基,为稳步积累进一步SO代表这个感觉不对,我(见bugs.python.org/issue21669有关错误信息,这太问题共同进化是如何背景)
ncoghlan 2015年

4
你好!我认为此工具可以帮助某人docs.python.org/2/library/2to3.html
Jhonatas Kleinkauff

1
在您的2.7文件中添加来自将来 import print_function的行以将新的python 3 print()行添加到您的代码中。因此,代码变得与2.7+和3.0+兼容
MasterControlProgram

您如何强制系统使用Python 2.7 vs 3?也许这是个好地方。
Praxiteles


18

语法从Python 2更改为Python3。在Python 2中,

print "Hello, World!" 

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

print("Hello, World!")

这与Scala等效,与Java差不多。


4

如果您的代码在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中也不适合我。代码没有括号。
Logicbloke

3

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

print("STRING")

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


3

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

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

Python 3.x:print(“指环王”)


讲解

print2.x中是一个语句,但在3.x中是一个函数。现在,有很多充分的理由。

  1. 使用Python 3.x的函数格式,当打印多个用逗号分隔的项目时,灵活性更高。
  2. 您不能在语句中使用参数展开。在3.x中,如果有要使用分隔符打印的项目列表,则可以执行以下操作:
>>> items = ['foo', 'bar', 'baz']
>>> print(*items, sep='+') 
foo+bar+baz
  1. 您不能覆盖语句。如果要更改print的行为,则可以在它是一个函数时执行此操作,但在声明时不可以。

2

我还可以补充一点,我知道Python2.7和之间有关语法更改的所有知识Python3,并且我的代码正确编写为as print("string")甚至 print(f"string")...

但是经过一段时间的调试后,我意识到我的bash脚本正在像这样调用python:

python file_name.py

这具有默认情况下使用python调用我的python脚本的作用,从而产生python2.7了错误。因此,我将bash脚本更改为:

python3 file_name.py

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


您还可以在文件顶部添加一个shebang,以指出要使用哪个Python加载文件
OneCricketeer

是个好主意!
阿尔法·布拉沃

1

除了这里的直接答案外,还应注意python 2和3之间的另一个主要区别。官方python Wiki涵盖了几乎所有主要区别,并着重于何时应使用这两个版本。这篇博客文章也很好地解释了当前的python宇宙以及迁移到python 3时仍未解决的难题。

据我所知,您正在开始学习python语言。在继续进行python 3路由之前,您应该考虑上述文章。您不仅需要更改某些语法,还需要考虑哪些包对您可用(python 2的优点)以及可以在代码中进行的潜在优化(python 3的优点) 。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.