Что такое repr() в Python?
Давайте спросим IDLE.
Что такое функция представления Python
Это говорит нам о пяти вещах:
- Это встроенная функция
- Это принимает объект
- Это возвращает каноническое строковое представление этого объекта.
- Он имеет следующий синтаксис:
- repr(obj, /)
- Для многих типов объектов и большинства встроенных функций верно, что eval(repr(obj))=obj
Теперь, что означает это последнее утверждение?
- ››› eval(repr(s))
'Привет'
- >>> s
'Привет'
А целое число?
- >>> x=7
- ››› eval(repr(x))==x
Истинный
Теперь, согласно официальной документации Python, repr() возвращает строку, содержащую печатное представление объекта. Для большинства типов в Python это даст вам строку, которая дает объект с тем же значением, что и при передаче его в eval(). Для некоторых других типов он возвращает строку, заключенную в угловые скобки. Он содержит тип объекта и другую информацию, такую как имя и адрес этого объекта.
Мы рекомендуем вам прочитать метод Python
Для нас это функция repr(). Для Python это класс, который контролирует, что он возвращает для своих экземпляров с помощью магического метода __repr__().
Пример представления Python
Давайте перейдем к примеру функции Python repr.
- ››› msg=’Привет, мир!’
- ››› repr(msg)
"'Привет мир!'"
Более пристальный взгляд на это говорит нам, что это возвращает «Hello, world!» в двойных кавычках. Если мы передаем это обратно в eval, это дает нам:
- ››› eval("Привет, мир!")
'Привет мир!'
Это не сработает:
- ››› eval(‘Привет, мир!’)
Traceback (последний последний вызов):
Файл «‹pyshell#16›», строка 1, в ‹модуле›
eval('Привет, мир!')
Файл «‹string›», строка 1
Привет мир!
^
SyntaxError: неожиданный EOF при синтаксическом анализе
Это потому, что у нас нет переменной с таким именем (Hello, world!)
Работа с объектами класса
Мы сказали, что repr() внутренне вызывает метод __repr__(). Давайте попробуем это с одним из наших собственных классов.
- ››› класс Цвет:
- цвет = «оранжевый»
- def __repr__(я):
- вернуть repr(self.color)
- ››› o=Цвет()
- ››› повтор(o)
"'апельсин'"
Здесь мы переопределяем метод __repr__(), чтобы заставить его делать то, что нам нужно. Когда мы произносим слово переопределить, обратите внимание, что в Color уже есть метод __repr__(). Это потому, что он наследуется от класса объекта, а у объекта есть метод __repr__().
- ››› issubclass(Цвет,объект)
Истинный
- ››› каталог(объект)
['__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 возвращает строку в угловых скобках для некоторых типов? Посмотрим как и где.
- ››› класс Оранжевый:
- def __init__(я,цвет,размер):
- self.color=цвет
- self.size = размер
- ››› o=Оранжевый(‘оранжевый’,7)
- >>> o
‹__main__.Оранжевый объект по адресу 0x02C6C1D0›
- ››› печать(o)
‹__main__.Оранжевый объект по адресу 0x02C6C1D0›
Это строки с именем класса и идентификатором экземпляра объекта (его адресом в памяти в CPython). Чтобы напечатать это лучше, мы используем информацию о том, что функция print() вызывает метод __str__ dunder/:
- ››› класс Оранжевый:
- def __init__(я,цвет,размер):
- self.color=цвет
- self.size = размер
- защита __str__(я):
- return f'Я {self.size} и {self.color}'
- ››› o=Оранжевый(‘оранжевый’,7)
- >>> o
‹__main__.Оранжевый объект по адресу 0x02D40E70›
- ››› печать(o)
мне 7 и я оранжевый
Это было круто! В Java для этого мы использовали бы метод toString().
str() против repr() в Python
Оба метода __str__() и __repr__() возвращают нам строки. Так что же отличает их?
- Цель __repr__ — быть недвусмысленным, а __str__ — читабельным.
- __repr__ является официальным, а __str__ несколько неформальным.
Возьмите пример, чтобы убедиться, что вы понимаете разницу:
- ››› s=’Привет’
- ››› печать(строка(s))
Привет
- ››› печать(воспроизведение(s))
'Привет'
- Оператор print и функция str() вызывают __str__, а repr() вызывает __repr__.
- Любая строка в приглашении интерпретатора вызывает __str__(), но объект в приглашении вызывает __repr__().
Хотите подготовиться к Python Interview — Нажмите здесь ›››
Посмотри:
- ››› ул(3)
‘3’
- ››› повтор(3)
‘3’
Они выглядят одинаково. Хорошо, а теперь взгляните на это:
- ››› импорт даты и времени
- ››› t=datetime.datetime.сейчас()
- ››› str(t) #Readable
‘2018–09–07 17:33:24.261778’
- ››› повтор(t)
‘datetime.datetime(2018, 9, 7, 17, 33, 24, 261778)’
- >>> t
datetime.datetime(2018, 9, 7, 17, 33, 24, 261778)
Используя это «официальное» представление, мы можем реконструировать объект, но не с тем, что дает нам функция str():
- ››› eval(‘datetime.datetime(2018, 9, 7, 17, 33, 24, 261778)’)
datetime.datetime(2018, 9, 7, 17, 33, 24, 261778)
Рекомендуемая литература — Модуль Python datetime
- ››› 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: недопустимый токен
Возьмем другой пример.
- ››› демо класса:
- защита __init__(я,а,б):
- я = а
- я.б=б
- def __repr__(я):
- вернуть ‘__repr__ для демонстрации’
- защита __str__(я):
- вернуть ‘__str__ для демонстрации’
- ››› d=демо(3,4)
- >>> d
__repr__ для демонстрации
- ››› печать(г)
__str__ для демонстрации
- ››› ул(д)
‘__str__ для демонстрации’
- ››› повтор(г)
‘__repr__ для демонстрации’
- >>> f’{d}’
‘__str__ для демонстрации’
Итак, все это было в учебнике Python repr. Надеюсь, вам понравилось наше объяснение.
Заключение — Python repr
Интерактивный интерпретатор также использует функцию repr() для вывода вашего выражения:
результат=выражение; если результат не None: вывести repr(результат)
Следовательно, в этой статье Python repr мы обсудили значение repr в Python. Кроме того, мы рассмотрели пример Python repr и работу с объектами класса. Более того, мы видели str vs repr в Python. Тем не менее, если у вас есть какие-либо вопросы относительно статьи о Python, задайте их на вкладке комментариев.