Print.__ doc__ vs getattr (__ builtin __, "print" ).__ doc__

print.__doc__ выходы:

SyntaxError: invalid syntax

где as

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

Выходы:

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

Печатает значения в потоке или по sys.stdout по умолчанию. Необязательные аргументы ключевого слова:

file: файловый объект (поток); по умолчанию используется текущий sys.stdout.
sep: строка, вставленная между значениями, по умолчанию пробел.
end: строка добавляется после последнего значения, по умолчанию используется новая строка.

Может ли кто-нибудь помочь мне понять, почему print.__doc__ дает синтаксическую ошибку вместо печати строки документа

Ответ 1

В 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 до N после запятой, необязательно предшествующего конструкту >> file, конструкция print.__doc__ является незаконной. Это имеет мало смысла, как if.__doc__, или return.__doc__.

Однако, начиная с Python 2.6, функция print доступна в модуле __builtin__, но не используется по умолчанию, поскольку оператор print сталкивается с ней, если только синтаксический анализ для print оператора не отключен на from __future__ import print_function.

Ответ 2

Печать не доступна глобально в функции Python 2, поэтому вы не можете рассматривать ее как объект. Это выражение.

В Python 3 или Python 2 с from __future__ import print_function, однако, print является нормальной функцией, и вы можете прочитать атрибут __doc__.

Смотрите: https://docs.python.org/2/library/functions.html#print

Примечание. Эта функция обычно недоступна как встроенная, так как печать имени распознается как оператор печати. Чтобы отключить оператор и использовать функцию print(), используйте этот оператор будущего в верхней части вашего модуля:

from __future__ import print_function