В чем разница между `>>> some_object` и` >>> print some_object` в интерпретаторе Python? - PullRequest
6 голосов
/ 19 августа 2011

В интерпретаторе вы можете просто написать название объекта, например, список a = [1, 2, 3, u"hellö"] в приглашении переводчика выглядит так:

>>> a
[1, 2, 3, u'hell\xf6']

или вы можете сделать:

>>> print a
[1, 2, 3, u'hell\xf6']

, что кажется эквивалентным для списков. На данный момент я работаю с hdf5 для управления некоторыми данными, и я понял, что есть разница между двумя методами, упомянутыми выше. Дано:

with tables.openFile("tutorial.h5", mode = "w", title = "Some Title") as h5file:
    group = h5file.createGroup("/", 'node', 'Node information')
    tables.table = h5file.createTable(group, 'readout', Node, "Readout example")

Выход

print h5file

отличается от

>>> h5file

Итак, мне было интересно, может ли кто-нибудь объяснить поведенческие различия Python в этих двух случаях?

Ответы [ 5 ]

8 голосов
/ 19 августа 2011

Ввод объекта в терминал вызывает __repr__(), что для детального представления объекта, который вы печатаете (однозначно).Когда вы говорите что-то «напечатать», вы звоните __str__() и, следовательно, просите что-нибудь читаемое человеком.

Алекс Мартелли дал отличное объяснение здесь .Другие ответы в цепочке также могут осветить разницу.

Например, взгляните на объекты datetime.

>>> import datetime
>>> now = datetime.datetime.now()

Сравните ...

>>> now
Out: datetime.datetime(2011, 8, 18, 15, 10, 29, 827606)

с...

>>> print now
Out: 2011-08-18 15:10:29.827606

Надеюсь, это сделает это немного яснее!

2 голосов
/ 19 августа 2011

Интерактивный интерпретатор напечатает результат каждого введенного в него выражения.(Поскольку операторы не оценивают, а скорее выполняют, это поведение при печати не применяется к таким операторам, как print, циклы и т. Д.)

Доказательство того, что repr() используется интерактивным интерпретатором, как указаноНиклас Розенштейн (используя переводчика 2.6):

>>> class Foo:
...   def __repr__(self):
...     return 'repr Foo'
...   def __str__(self):
...     return 'str Foo'
...
>>> x = Foo()
>>> x
repr Foo
>>> print x
str Foo

Так что, хотя в интерактивном интерпретаторе оператор print может быть ненужным (если вам не нужен str, а не repr),интерактивный переводчик не делает этого.Размещение вышеуказанного кода в файле и запуск файла не приведет к печати. ​​

1 голос
/ 19 августа 2011

Оператор print всегда вызывает метод x.__str__(), в то время как (только в интерактивном интерпретаторе) просто вызывается переменная, вызываемая объектами x.__repr__().

>>> '\x02agh'
'\x02agh'
>>> print '\x02agh'
'agh'
0 голосов
/ 24 декабря 2011

print(variable) равно print(str(variable))

тогда

variable равно print(repr(variable))

Очевидно, что __repr__ и __str__ метод объекта h5file дают разные результаты.

0 голосов
/ 19 августа 2011

Посмотрите документацию Python по адресу: http://docs.python.org/reference/datamodel.html#object.repr

объект. магнезии (само)

Called by the repr() built-in function and by string conversions

(обратные кавычки) для вычисления «официального» строкового представления объект. Если это вообще возможно, это должно выглядеть как действительный Python выражение, которое можно использовать для воссоздания объекта с тем же значение (с учетом соответствующей среды). Если это невозможно, Строка вида <... некоторое полезное описание ...> должна быть возвращена. Возвращаемое значение должно быть строковым объектом. Если класс определяет repr (), но не str (), тогда repr () также используется, когда «Неформальное» строковое представление экземпляров этого класса требуется.

This is typically used for debugging, so it is important that the

представление богато информацией и однозначно.

объект. * * Ул одна тысяча двадцать-одна * +1022 * (само)

Called by the str() built-in function and by the print statement

для вычисления «неформального» строкового представления объекта. это отличается от repr () тем, что он не обязательно должен быть действительным Python выражение: может быть использовано более удобное или краткое представление вместо. Возвращаемое значение должно быть строковым объектом.

Пример: * * тысяча тридцать-один

>>> class A():
...    def __repr__(self): return "repr!"
...    def __str__(self): return "str!"
... 
>>> a = A()
>>> a
repr!
>>> print(a)
str!
>>> class B():
...    def __repr__(self): return "repr!"
... 
>>> class C():
...    def __str__(self): return "str!"
... 
>>> b = B()
>>> b
repr!
>>> print(b)
repr!
>>> c = C()
>>> c
<__main__.C object at 0x7f7162efb590>
>>> print(c)
str!

Функция печати выводит на консоль все аргументы __str__. Как print(str(obj)).

Но в интерактивной консоли выводится возвращаемое значение функции __repr__. И если __str__ не определено, вместо него можно использовать __repr__.

В идеале __repr__ означает, что мы должны просто использовать это представление для воспроизведения этого объекта. Он не должен быть одинаковым для разных классов или объектов, представляющих разные значения, например, datetime.time:

Но __str__ (то, что мы получаем от str(obj)) должно показаться хорошим, потому что мы показываем это пользователю.

>>> a = datetime.time(16, 42, 3)
>>> repr(a)
'datetime.time(16, 42, 3)'
>>> str(a)
'16:42:03' #We dont know what it is could be just print:
>>> print("'16:42:03'")
'16:42:03'

И, простите за плохой английский:).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...