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

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

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

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

Вопросов:

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

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

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

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

repr самом деле вызывает магический метод __repr__ of x , который дает строку, содержащую представление значения 'foo' назначенного x . Поэтому он возвращает 'foo' внутри строки "" приводит к "'foo'" . Идея 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' та же строка 'foo' .

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

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

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

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

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

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

 x = 'foo' y = x 

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

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

Когда ты говоришь

 foo = 'bar' baz(foo) 

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