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

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__ выдает синтаксическую ошибку вместо печати строки документа


person claudius    schedule 30.05.2014    source источник


Ответы (2)


В Python 2 (или Python ‹2.6, если быть очень точным) print абсолютно не похож на функцию и, следовательно, не имеет строки документации. Он даже не оценивает все свои аргументы перед тем, как начать печать:

>>> 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.

person Antti Haapala    schedule 30.05.2014

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

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

См .: https://docs.python.org/2/library/functions.html#print

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

from __future__ import print_function
person Kos    schedule 30.05.2014
comment
+1 Мне никогда не приходило в голову, что функция print всегда доступна, и что будущий импорт просто отключил оператор print, вместо того, чтобы сделать функцию print доступной. - person chepner; 30.05.2014