为什么打印(" {}")。format()有效的语法?

时间:2015-08-19 02:49:09

标签: python

今天进入一些有趣的Python行为。我虽然在写作

print("{}".format("some value")) 

但我写了

print("{}").format("some value")

并且有趣的是它有效。所以我的问题是,这是如何工作的?

深入挖掘

这种行为似乎是特定于python2的。

Python2.7

>>> print("{}").format("testing")
testing

Python3.4

>>> print("{}").format("testing)
  File "<stdin>", line 1
    print("{}").format("testing)
                               ^
SyntaxError: EOL while scanning string literal

似乎python2的打印功能没有返回值,但Python3呢?这让我更加困惑。

Python2.7

>>> type(print("testing))
  File "<stdin>", line 1
    type(print("testing))
             ^
SyntaxError: invalid syntax
>>> a = print("testing")
  File "<stdin>", line 1
    a = print("testing")
            ^
SyntaxError: invalid syntax

Python3.4

>>> type(print("{}"))
{}
<class 'NoneType'>
>>> a = print("{}")
{}
>>> a
>>> type(a)
<class 'NoneType'>

4 个答案:

答案 0 :(得分:7)

在Python 2中,print是一个语句,而不是一个函数(除非你在模块的顶部做from __future__ import print_function)。这意味着您正在打印的事物周围的括号不是函数调用的一部分,而只是被视为分组括号。在您描述的情况下,("{}")"{}"相同(parens不执行任何操作),因此format调用就像您在编写{{1}时所期望的那样工作}。

在Python 3中,"{}".format(...)是一个函数,因此括号不是可选的,不能放在错误的位置。 print会返回print,因此,如果None print(something).something_else None没有something_else,您几乎肯定会收到错误属性。

答案 1 :(得分:1)

在Python 2.7中,print是一个声明;这意味着

print("{}").format("testing")

打印一个表达式,即表达式("{}").format("testing")的结果。也就是说,在计算print语句之前,在(带括号的)字符串上调用format方法。如果你使用

from __future__ import print_function
在2.7示例中,您将获得与Python 3相同的行为。

答案 2 :(得分:1)

  1. 您错过了某些字符串后的结束语(例如"testing)。
  2. 正如其他人所说,Python 2没有print()函数,它有一个print语句。你的字符串(即使它们被正确关闭)也不是你认为的字符串。

答案 3 :(得分:0)

在Python 2中,print is a statement keywordraise类似,而不是函数。括号不用于其参数,因此print("{}").format("testing")被解析为好像您写的print ("{}").format("testing"),与print(("{}").format("testing"))相同。因为print是一个语句,所以它不能用作表达式,因此它不能有返回值。

如果您希望Python 2中的print像Python 3的print函数一样运行,请将此行放在文件的顶部:

from __future__ import print_function