print.__doc__ 与 getattr(__builtin__,"print").__doc__ 的区别

10 投票
2 回答
869 浏览
提问于 2025-04-18 08:02

print.__doc__ 的输出是:

SyntaxError: invalid syntax

>>> getattr(__builtin__,"print").__doc__

输出是:

print(value, ..., sep=' ', end='\n', file=sys.stdout)

这个函数会把值打印到一个流中,默认是 sys.stdout。你可以用一些可选的关键词参数:

file : 一个类似文件的对象(流);默认是当前的 sys.stdout
sep: 在值之间插入的字符串,默认是一个空格。
end: 在最后一个值后面添加的字符串,默认是换行符。

有没有人能帮我理解为什么 print.__doc__ 会出现语法错误,而不是打印出文档字符串?

2 个回答

9

在Python 2中,print并不是一个全局可用的函数,所以你不能把它当作一个对象来使用。它其实是一个语句。

不过在Python 3中,或者在Python 2中加上from __future__ import print_function,print就变成了一个普通的函数,这样你就可以查看它的__doc__属性了。

你可以查看这个链接了解更多信息:https://docs.python.org/2/library/functions.html#print

注意:这个函数通常不是内置的,因为print这个名字被当作print语句来识别。如果你想禁用这个语句并使用print()函数,可以在你的模块顶部加上这个未来语句:

from __future__ import print_function
17

在Python 2(或者说更准确一点,是Python 2.6之前的版本),print根本就不是一个函数,所以它没有文档字符串(docstring)。而且,它在开始打印之前并不会先计算所有的参数:

>>> print 42, a
42
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined

比如说,42会在a被计算之前就被打印出来。print是一个语句,它后面可以跟0到多个用逗号分隔的表达式,前面可以选择性地加上>> file这样的构造。而像print.__doc__这样的写法是非法的。它就像if.__doc__或者return.__doc__一样没有意义。

不过,从Python 2.6开始,print变成了一个可以使用的函数,它在__builtin__模块里,但默认情况下并不会使用这个函数,因为print作为语句和它会冲突,除非通过from __future__ import print_function来禁用对print语句的解析。

撰写回答