Понимание функции repr() в Python

#python #repr

#python #repr

Вопрос:

repr() : вычисляемое строковое представление объекта (может «eval ()», что означает, что это строковое представление, которое преобразуется в объект Python)

Другими словами:

 >>> x = 'foo'
>>> repr(x)
"'foo'"
  

Вопросы:

  1. Почему я получаю двойные кавычки, когда я это делаю repr(x) ? (Я не получаю их, когда делаю str(x) )
  2. Почему я получаю 'foo' , когда я делаю eval("'foo'") , а не x, который является объектом?

Ответ №1:

 >>> x = 'foo'
>>> x
'foo'
  

Таким образом, имя x привязывается к 'foo' строке. Когда вы вызываете, например repr(x) , интерпретатор помещает 'foo' вместо x , а затем вызывает repr('foo') .

 >>> repr(x)
"'foo'"
>>> x.__repr__()
"'foo'"
  

repr на самом деле вызывает волшебный метод __repr__ x , который выдает строку, содержащую представление 'foo' присвоенного значения x . Таким образом, он возвращает 'foo' внутри строки "" , приводящей к "'foo'" . Идея repr состоит в том, чтобы предоставить строку, содержащую ряд символов, которые мы можем ввести в интерпретаторе и получить то же значение, которое было отправлено в качестве аргумента repr .

 >>> eval("'foo'")
'foo'
  

Когда мы вызываем eval("'foo'") , это то же самое, что мы вводим 'foo' в интерпретаторе. Это когда мы непосредственно вводим содержимое внешней строки "" в интерпретаторе.

 >>> eval('foo')

Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    eval('foo')
  File "<string>", line 1, in <module>
NameError: name 'foo' is not defined
  

Если мы вызываем eval('foo') , это то же самое, что мы вводим foo в интерпретаторе. Но foo доступной переменной нет, и возникает исключение.

 >>> str(x)
'foo'
>>> x.__str__()
'foo'
>>> 
  

str это просто строковое представление объекта (помните, x что переменная ссылается на 'foo' ), поэтому эта функция возвращает строку.

 >>> str(5)
'5'
  

Строковое представление целого 5 числа является '5' .

 >>> str('foo')
'foo'
  

И строковое представление строки 'foo' — это та же строка 'foo' .

Комментарии:

1. Можете ли вы также сообщить нам о некоторых вариантах использования, когда следует использовать функцию repr. Я не могу понять, что

Ответ №2:

Обратная связь, которую вы получаете от интерактивного интерпретатора repr , тоже используется. Когда вы вводите выражение (пусть оно будет expr ), интерпретатор в основном выполняет result = expr; if result is not None: print repr(result) . Итак, вторая строка в вашем примере форматирует строку foo в нужное вам представление ( 'foo' ) . И затем интерпретатор создает repr ее значение, оставляя вас в двойных кавычках.

Почему, когда я объединяю%r с экранированием двойных и одинарных кавычек и распечатываю их, он печатает его так, как я бы написал в своем файле .py, но не так, как я хотел бы это видеть?

Я не уверен, о чем вы здесь спрашиваете. Текст single ' and double " quotes при прогоне repr включает экранирование для одного вида кавычек. Конечно, это так, иначе это не было бы допустимым строковым литералом по правилам Python. Это именно то, о чем вы просили, вызывая repr .

Также обратите внимание, что eval(repr(x)) == x аналогия не подразумевается буквальной. Это приближение и справедливо для большинства (всех?) встроенные типы, но главное, что вы получаете довольно хорошее представление о типе и логическом «значении», просматривая repr выходные данные.

Комментарии:

1. Первоначально это должно было быть буквальным: каждое значение repr должно быть либо чем-то, что можно передать eval (или скопировать и вставить в ваш исходный код) для получения равного значения, либо чем-то, что вызовет ошибку SyntaxError при попытке этого (обычно <…> стиль, созданный object.__repr__ ). С годами это постепенно смягчалось, и к 2.7 и 3.x это просто верно «для многих типов», и даже в stdlib есть исключения (например, namedtuple тип, созданный как локальный, даст вам repr , что вы не можете eval ), но это был оригиналидея.

Ответ №3:

str() используется для создания выходных данных для конечного пользователя, в то время repr() как используется для отладки во время разработки. И это официальное представление объекта.

Пример:

 >>> import datetime
>>> today = datetime.datetime.now()
>>> str(today)
'2018-04-08 18:00:15.178404'
>>> repr(today)
'datetime.datetime(2018, 4, 8, 18, 3, 21, 167886)'
  

Из выходных данных мы видим, что repr() это показывает официальное представление объекта date.

Ответ №4:

1) Результатом repr('foo') является строка 'foo' . В вашей оболочке Python результат выражения также выражается в виде представления, так что вы, по сути, видите repr(repr('foo')) .

2) eval вычисляет результат выражения. Результатом всегда является значение (например, число, строка или объект). Несколько переменных могут ссылаться на одно и то же значение, как в:

 x = 'foo'
y = x
  

x и y теперь относятся к одному и тому же значению.

3) Я понятия не имею, что вы здесь имели в виду. Можете ли вы опубликовать пример и что бы вы хотели увидеть?

Ответ №5:

Когда вы говорите

 foo = 'bar'
baz(foo)
  

вы не переходите foo к baz функции. foo в данном случае это просто имя, используемое для представления значения 'bar' , и это значение передается baz функции.