Розуміння функції repr () в Python


152

repr(): рядкове представлення об'єкта, що може оцінюватися (може "eval ()" його, тобто це представлення рядка, що оцінює об'єкт Python)

Іншими словами:

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

Запитання:

  1. Чому я отримую подвійні лапки, коли це роблю repr(x)? (Я не отримую їх, коли я це роблю str(x))
  2. Чому я отримую, 'foo'коли це роблю, eval("'foo'")а не x, що є об'єктом?

Відповіді:


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


Чи можете ви також повідомити нам про деякі випадки використання, коли слід використовувати функцію repr. Я не в змозі збагнути цього
гаурав парашар

14

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

Чому, коли я комбіную%% з двосписковими та одинарними цитатами, видаляється та роздруковується, він друкує його так, як я записав би його у свій .py файл, але не так, як я хотів би це бачити?

Я не впевнений, що ви тут просите. Текст single ' and double " quotesпід час проходження reprвключає в себе виклики для одного виду цитати. Звичайно, це так, інакше це не буде дійсним рядковим літералом за правилами Python. Саме це ви і попросили, зателефонувавши repr.

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


2
Спочатку це насправді мало бути буквальним: кожне значення reprповинно бути чи то, що може бути передано eval(або скопійовано і вставлено у ваш вихідний код), щоб отримати рівне значення, або щось, що підніме SyntaxError при спробі цього (зазвичай <…>стиль виробництва object.__repr__). Це поступово зменшувалося протягом багатьох років, і на 2.7 і 3.x це справедливо "для багатьох типів", і є виключення навіть у stdlib (наприклад, namedtupleтип, створений як локальний, дасть reprвам змогу " t eval), але це була первісна ідея.
abarnert

7

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 () показує офіційне представлення об'єкта дати.


3

1) Результат repr('foo')- рядок 'foo' . У вашій оболонці Python результат вираження виражається також як подання, так що ви по суті бачите repr(repr('foo')).

2) evalобчислює результат виразу. Результатом завжди є значення (наприклад, число, рядок або об'єкт). Кілька змінних можуть посилатися на те саме значення, що і в:

x = 'foo'
y = x

x і y тепер відносяться до одного і того ж значення.

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


1

Коли ти кажеш

foo = 'bar'
baz(foo)

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.