Что такое repr() в Python?

Давайте спросим IDLE.

Что такое функция представления Python

Это говорит нам о пяти вещах:

  • Это встроенная функция
  • Это принимает объект
  • Это возвращает каноническое строковое представление этого объекта.
  • Он имеет следующий синтаксис:
  1. repr(obj, /)
  • Для многих типов объектов и большинства встроенных функций верно, что eval(repr(obj))=obj

Теперь, что означает это последнее утверждение?

  1. ››› eval(repr(s))

'Привет'

  1. >>> s

'Привет'

А целое число?

  1. >>> x=7
  2. ››› eval(repr(x))==x

Истинный

Теперь, согласно официальной документации Python, repr() возвращает строку, содержащую печатное представление объекта. Для большинства типов в Python это даст вам строку, которая дает объект с тем же значением, что и при передаче его в eval(). Для некоторых других типов он возвращает строку, заключенную в угловые скобки. Он содержит тип объекта и другую информацию, такую ​​как имя и адрес этого объекта.

Мы рекомендуем вам прочитать метод Python

Для нас это функция repr(). Для Python это класс, который контролирует, что он возвращает для своих экземпляров с помощью магического метода __repr__().

Пример представления Python

Давайте перейдем к примеру функции Python repr.

  1. ››› msg=’Привет, мир!’
  2. ››› repr(msg)

"'Привет мир!'"

Более пристальный взгляд на это говорит нам, что это возвращает «Hello, world!» в двойных кавычках. Если мы передаем это обратно в eval, это дает нам:

  1. ››› eval("Привет, мир!")

'Привет мир!'

Это не сработает:

  1. ››› eval(‘Привет, мир!’)

Traceback (последний последний вызов):

Файл «‹pyshell#16›», строка 1, в ‹модуле›

eval('Привет, мир!')

Файл «‹string›», строка 1

Привет мир!

^

SyntaxError: неожиданный EOF при синтаксическом анализе

Это потому, что у нас нет переменной с таким именем (Hello, world!)

Работа с объектами класса

Мы сказали, что repr() внутренне вызывает метод __repr__(). Давайте попробуем это с одним из наших собственных классов.

  1. ››› класс Цвет:
  2. цвет = «оранжевый»
  3. def __repr__(я):
  4. вернуть repr(self.color)
  5. ››› o=Цвет()
  6. ››› повтор(o)

"'апельсин'"

Здесь мы переопределяем метод __repr__(), чтобы заставить его делать то, что нам нужно. Когда мы произносим слово переопределить, обратите внимание, что в Color уже есть метод __repr__(). Это потому, что он наследуется от класса объекта, а у объекта есть метод __repr__().

  1. ››› issubclass(Цвет,объект)

Истинный

  1. ››› каталог(объект)

['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', ' __le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

Помните, в начале мы сказали, что repr возвращает строку в угловых скобках для некоторых типов? Посмотрим как и где.

  1. ››› класс Оранжевый:
  2. def __init__(я,цвет,размер):
  3. self.color=цвет
  4. self.size = размер
  5. ››› o=Оранжевый(‘оранжевый’,7)
  6. >>> o

‹__main__.Оранжевый объект по адресу 0x02C6C1D0›

  1. ››› печать(o)

‹__main__.Оранжевый объект по адресу 0x02C6C1D0›

Это строки с именем класса и идентификатором экземпляра объекта (его адресом в памяти в CPython). Чтобы напечатать это лучше, мы используем информацию о том, что функция print() вызывает метод __str__ dunder/:

  1. ››› класс Оранжевый:
  2. def __init__(я,цвет,размер):
  3. self.color=цвет
  4. self.size = размер
  5. защита __str__(я):
  6. return f'Я {self.size} и {self.color}'
  7. ››› o=Оранжевый(‘оранжевый’,7)
  8. >>> o

‹__main__.Оранжевый объект по адресу 0x02D40E70›

  1. ››› печать(o)

мне 7 и я оранжевый

Это было круто! В Java для этого мы использовали бы метод toString().

str() против repr() в Python

Оба метода __str__() и __repr__() возвращают нам строки. Так что же отличает их?

  • Цель __repr__ — быть недвусмысленным, а __str__ — читабельным.
  • __repr__ является официальным, а __str__ несколько неформальным.

Возьмите пример, чтобы убедиться, что вы понимаете разницу:

  1. ››› s=’Привет’
  2. ››› печать(строка(s))

Привет

  1. ››› печать(воспроизведение(s))

'Привет'

  • Оператор print и функция str() вызывают __str__, а repr() вызывает __repr__.
  • Любая строка в приглашении интерпретатора вызывает __str__(), но объект в приглашении вызывает __repr__().

Хотите подготовиться к Python Interview — Нажмите здесь ›››

Посмотри:

  1. ››› ул(3)

‘3’

  1. ››› повтор(3)

‘3’

Они выглядят одинаково. Хорошо, а теперь взгляните на это:

  1. ››› импорт даты и времени
  2. ››› t=datetime.datetime.сейчас()
  3. ››› str(t) #Readable

‘2018–09–07 17:33:24.261778’

  1. ››› повтор(t)

‘datetime.datetime(2018, 9, 7, 17, 33, 24, 261778)’

  1. >>> t

datetime.datetime(2018, 9, 7, 17, 33, 24, 261778)

Используя это «официальное» представление, мы можем реконструировать объект, но не с тем, что дает нам функция str():

  1. ››› eval(‘datetime.datetime(2018, 9, 7, 17, 33, 24, 261778)’)

datetime.datetime(2018, 9, 7, 17, 33, 24, 261778)

Рекомендуемая литература — Модуль Python datetime

  1. ››› eval('2018-09-07 17:33:24.261778')

Traceback (последний последний вызов):

Файл «‹pyshell#56›», строка 1, в ‹модуле›

eval('2018-09-07 17:33:24.261778')

Файл «‹string›», строка 1

2018–09–07 17:33:24.261778

^

SyntaxError: недопустимый токен

Возьмем другой пример.

  1. ››› демо класса:
  2. защита __init__(я,а,б):
  3. я = а
  4. я.б=б
  5. def __repr__(я):
  6. вернуть ‘__repr__ для демонстрации’
  7. защита __str__(я):
  8. вернуть ‘__str__ для демонстрации’
  9. ››› d=демо(3,4)
  10. >>> d

__repr__ для демонстрации

  1. ››› печать(г)

__str__ для демонстрации

  1. ››› ул(д)

‘__str__ для демонстрации’

  1. ››› повтор(г)

‘__repr__ для демонстрации’

  1. >>> f’{d}’

‘__str__ для демонстрации’

Итак, все это было в учебнике Python repr. Надеюсь, вам понравилось наше объяснение.

Заключение — Python repr

Интерактивный интерпретатор также использует функцию repr() для вывода вашего выражения:

результат=выражение; если результат не None: вывести repr(результат)

Следовательно, в этой статье Python repr мы обсудили значение repr в Python. Кроме того, мы рассмотрели пример Python repr и работу с объектами класса. Более того, мы видели str vs repr в Python. Тем не менее, если у вас есть какие-либо вопросы относительно статьи о Python, задайте их на вкладке комментариев.