相关文章推荐
温文尔雅的罐头  ·  cv2.error: could not ...·  5 月前    · 
失恋的鞭炮  ·  Windows10 2H2 创建 TLS ...·  1 年前    · 

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

436 人关注

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

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

那是什么意思?

python
python-3.x
ncoghlan
ncoghlan
发布于 2014-08-22
11 个回答

这个错误信息意味着你正试图用Python 3来遵循一个例子或运行一个使用Python 2 print 语句的程序。

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

至于whyprint在Python 3中成为一个普通的函数,这与语句的基本形式无关,而是与你如何做更复杂的事情有关,比如用尾部的空格而不是结束行来打印多个项目到stderr。

In Python 2:

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

In 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表达式周围放置引号是很直接的。

我感谢@antti-haapala在顶部添加了摘要,直接回答了问题,然后继续对错误信息的来源进行了较长的解释 :)
我还把答案换成了社区维基,因为稳步积累更多的SO代表对我来说并不合适(见 bugs.python.org/issue21669 以了解该错误信息和这个SO问题是如何共同发展的背景)
你好!我认为这个工具可以帮助某人 docs.python.org/2/library/2to3.html
添加一行 from future import print_function 在你的2.7文件中添加新的python 3 print()行到你的代码。因此,代码将与2.7+和3.0+兼容。
如何强迫系统使用Python 2.7与3?也许这是个好地方。
Christian
Christian
发布于 2021-11-22
0 人赞同

不幸的是,老 xkcd comic 已经不是完全最新的了。

从Python 3.0开始,你必须写。

print("Hello, World!")

还有人要写那个antigravity库:(

但反重力是存在的......你试着导入它吗?)
Sagar balai
Sagar balai
发布于 2021-11-22
0 人赞同

从Python 2到Python 3,在语法上有一个变化。 在Python 2中。

print "Hello, World!" 

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

print("Hello, World!")

这是等同于Scala的语法,接近于Java。

Bran
只有那些想破坏一种语言的人,才会把语法改变到这种程度。自然要做的是保留这两种语法的有效性。
Om Sao
Om Sao
发布于 2021-11-22
0 人赞同

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

Python 2.x : print "Lord of the Rings"

Python 3.x : print("Lord of the Rings")

Explanation

print 是一个 声明 in 2.x ,但这是一个 function in 3.x .现在,这有许多很好的理由。

  • With function format of Python 3.x, more flexibility comes when printing multiple items with comma separated.
  • You can't use argument splatting with a 声明. In 3.x if you have a list of items that you want to print with a separator, you can do this:
  • >>> items = ['foo', 'bar', 'baz']
    >>> print(*items, sep='+')
    foo+bar+baz
    
  • You can't override a 声明. If you want to change the behavior of print, you can do that when it's a function but not when it's a 声明.
  • Lukasz
    Lukasz
    发布于 2021-11-22
    0 人赞同

    如果你的代码应该在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中,即使有这个导入,对我来说也不起作用。代码中没有括号。
    Larry
    Larry
    发布于 2021-11-22
    0 人赞同

    在Python 3中,你只能打印为。

    print("STRING")
    

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

    Alfa Bravo
    Alfa Bravo
    发布于 2021-11-22
    0 人赞同

    我也可以直接补充说,我对 Python2.7 Python3 之间的语法变化了如指掌,我的代码正确写成了 print("string") ,甚至是 print(f"string") ...

    但经过一段时间的调试,我意识到我的bash脚本在调用python,就像。

    python file_name.py

    这样做的结果是默认使用 python2.7 来调用我的Python脚本,从而产生了错误。所以我把我的bash脚本改为。

    python3 file_name.py

    这当然是使用python3来运行修复错误的脚本。

    你也可以在文件的顶部添加一个shebang,以说明用哪种Python来加载该文件
    Chad Van De Hey
    Chad Van De Hey
    发布于 2021-11-22
    0 人赞同

    在这里的直接答案之外,人们应该注意到python 2和3之间的另一个关键区别。该 官方的Python wiki 该书介绍了几乎所有的主要区别,并重点介绍了你应该在什么时候使用其中一个版本。 This blog post 也很好地解释了当前的Python世界和转移到Python 3的一些未解之谜。

    就我所知,你正在开始学习python语言。在你继续走python 3路线之前,你应该考虑上述文章。你不仅要改变你的一些语法,你还需要考虑哪些包可以用(python 2的优势),以及在你的代码中可以进行的潜在优化(python 3的优势)。

    CinnamonCubing
    CinnamonCubing
    发布于 2021-11-22
    0 人赞同

    print('Hello, World!')

    你使用的是Python 3,在那里打印时需要括号。

    Mr. Day
    Mr. Day
    发布于 2021-11-22
    0 人赞同

    替换代码0】不是在Python中打印文本的方法,因为这不会工作。 替换代码1】将在命令行中的屏幕上打印上述文本。

    Kshitij Agarwal
    Kshitij Agarwal
    发布于 2021-11-22
    0 人赞同

    所以我得到了这个错误

    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),用于软件包中每个文件的每一行,这并不是一个好主意😅。我的意思是,你可以这么做,但还是有更好的方法。

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

    pip install 2to3
    

    然后将终端中的目录改为软件包文件所在的位置,在我的例子中是------。C:\Users\Kshitij Agarwal\AppData\Roaming\Python\Python39\site-packages\trp