2016-02-25 3 views
0

Почему интерпретатор Python использует repr() для печати выражений?Почему интерпретатор Python использует функцию repr() для печати выражений?

Например:

>>> S = "First line.\nSecond line." 
>>> S 
'First line.\nSecond line.' 

Конечно, я могу вызвать str() в операторе печати:

>>> print S 
First line. 
Second line. 

Но почему str() не запускается по умолчанию в интерактивном режиме? По-видимому, это лучший выбор во многих отношениях.

+3

Полное умозрение: В интерактивной среде, вы, вероятно, скопировать и вставить результат одного выражения в новое выражение. Если это обычный вариант использования, то 'repr' более полезен, чем' str'. – Kevin

+2

Потому что это делает больше смысла для интерактивной отладки ** сложных ** значений !? Если выражение приводит к экземпляру класса, простой 'print' может не дать вам никакой или вводящей в заблуждение информации. Попробуйте распечатать экземпляр 'datetime' например ... это строка или объект ...? – deceze

+4

* «По-видимому, лучший выбор во многих отношениях» * - приведенный вами пример не показывает этого вообще, 'repr' недвусмысленно, когда строка имеет непечатаемые символы и пробелы. – jonrsharpe

ответ

6

str() используется для «довольно печатания», но в интерпретаторе Python вы, скорее всего, захотите получить справочную информацию, такую ​​как идентификатор объекта, какой класс он и т. Д. (Теоретически), и repr() используется для этого. Если вы запустите pydoc __builtin__.repr, он говорит: «Для большинства типов объектов, eval (repr (object)) == object." Есть несколько типов, которые совершенно разные, но метод __str__ возвращает то же самое. Например, str(str(some_object)) - это то же самое, что и str(same_object), поэтому, если бы у меня был список, [0, 4, 5], и я напечатал его str, я бы получил [0, 4, 5]. Если бы я напечатал str(mylist) с str(), я бы все равно получил [0, 4, 5], хотя они разные. Однако с repr()str(mylist) будет напечатан как '[0, 4, 5]', что более вероятно, что я искал. Кто-то, кто использует интерпретатор, вероятно, что-то тестирует или отлаживает что-то, и он хотел бы знать, что это строка, а не список.

1

repr - метод, который возвращает как object is represented внутри вашей программы, в то время как str возвращает, как это должно быть показано снаружи.

Например

class Person(object): 
    def __init__(self, name, age, passport): 
     self.name = name 
     self.age = age 
     self.passport = passport 
    def __repr__(self): 
     return 'Name: {0}\nAge: {1}\nPassport: {2}'.format(self.name, self.age, self.passport) 
    def __str__(self): 
     return 'Hi, my name is {0}. How are you?'.format(self.name) 

Затем в интерактивном режиме вы можете сделать:

>>> paul = Person('Paul', 30, 'XXXXXXXXX1') 
>>> paul 
Name: paul 
Age: 30 
Passport: XXXXXXXXX1 
>>> print(paul) 
Hi, my name is Paul. How are you? 
Смежные вопросы