Repr: примеры (PYTHON)
repr(object): strФункция repr() в Python
Функция repr() возвращает строковое представление объекта, которое в идеале должно быть валидным выражением Python и содержать информацию о типе объекта. Это представление предназначено в первую очередь для разработчика.
Функция используется для отладки, логирования, сериализации и в тех случаях, когда необходимо получить точное и однозначное описание объекта. Встроенная функция repr() вызывает специальный метод объекта __repr__().
Сигнатура и параметры
repr(object)
- object (обязательный): Любой объект, строковое представление которого необходимо получить.
Возвращаемое значение
Функция возвращает строку (str), содержащую печатаемое представление переданного объекта. Для многих встроенных типов эта строка является корректным кодом на Python, который позволяет воссоздать аналогичный объект.
Простые примеры использования repr()
Примеры с различными типами данных.
print(repr(123))
print(repr(3.14159))
print(repr('Hello World'))
print(repr([1, 2, 3]))
print(repr({'a': 1, 'b': 2}))
print(repr(True))
print(repr(None))123
3.14159
'Hello World'
[1, 2, 3]
{'a': 1, 'b': 2}
True
NoneПример с экранированием строки.
text = "Line 1\nLine 2\tTab"
print('str:', str(text))
print('repr:', repr(text))str: Line 1 Line 2 Tab repr: 'Line 1\nLine 2\tTab'
Похожие функции в Python
- str(object): Возвращает «неформальное» или хорошо читаемое строковое представление объекта. Предназначено для конечного пользователя. Вызывает метод
__str__(), а при его отсутствии -__repr__(). - ascii(object): Работает аналогично
repr(), но возвращает представление, в котором все не-ASCII символы экранированы с помощью escape-последовательностей (\x,\u,\U). - format(object, format_spec): Возвращает форматированное строковое представление объекта в соответствии с переданной спецификацией. Вызывает метод
__format__().
repr() предпочтительнее для отладки и логов, str() - для вывода информации пользователю, ascii() - для безопасного представления с не-ASCII символами.
Аналоги функции в других языках
- PHP:
var_export($var, true)возвращает валидный PHP-код для представления переменной. Отличие: более детализированный вывод структур.
// PHP
$arr = ['a' => 1];
echo var_export($arr, true);array ( 'a' => 1, )
JSON.stringify() сериализует в JSON, но теряет информацию о функциях и типах. Для объектов используется метод toString().// JavaScript
console.log(JSON.stringify({a: 1}));
console.log({a: 1}.toString());{"a":1}
"[object Object]"Object.toString() является аналогом, но по конвенции не обязан возвращать валидный код Java. Для сериализации используется отдельный механизм.Object.ToString(). Для получения полной информации об объекте при отладке используется метод Object.GetType() и сериализаторы.fmt с форматированием. fmt.Sprintf("%#v", value) выводит Go-синтаксическое представление значения.// Go
package main
import "fmt"
func main() {
m := map[string]int{"a": 1}
fmt.Printf("%#v\n", m)
}map[string]int{"a":1}Типичные ошибки и особенности
- Путаница между
repr()иstr(): Ожидание читаемого формата отrepr().
s = "Hello\nWorld"
# Ожидание: Hello World (как у str)
# Реальность: 'Hello\nWorld' (экранированные символы)
print(repr(s))'Hello\nWorld'
__repr__ в пользовательском классе: По умолчанию возвращается бесполезное представление.class MyClass:
pass
obj = MyClass()
print(repr(obj))<__main__.MyClass object at 0x7f8a1c0b5f70>
__repr__, если метод обращается к самому объекту в строковом контексте без условий.class BadClass:
def __repr__(self):
return f'BadClass(repr={self})' # Вызовет str(self), что может привести к рекурсии
# На практике это вызовет RecursionErrorИстория изменений
- Python 3.2: Для
bytearrayфункцияrepr()начала возвращать более компактное представлениеbytearray(b'...')вместоbytearray([...]). - Python 3.4: Представление именованных кортежей (
collections.namedtuple) черезrepr()стало более читаемым, включая имена полей. - Python 3.11: В целом, работа
repr()с различными структурами оптимизирована для скорости и компактности вывода, но без кардинальных изменений синтаксиса возвращаемых строк.
Расширенные примеры применения
Определение __repr__ в пользовательском классе.
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return f'Point(x={self.x!r}, y={self.y!r})'
p = Point(5, -3)
print(repr(p))
# Создание нового объекта с помощью eval
p2 = eval(repr(p))
print(p2.x, p2.y)Point(x=5, y=-3) 5 -3
Использование !r в f-строках для автоматического вызова repr().
name = "Alice"
age = 30
print(f"str: {name}, repr: {name!r}")
print(f"Словарь из repr: { {'name': name!r, 'age': age!r} }")str: Alice, repr: 'Alice'
Словарь из repr: {'name': 'Alice', 'age': 30}Рекурсивное представление сложных структур.
tree = [1, [2, [3, 4], 5], [6, 7]]
print(repr(tree))
import datetime
dt = datetime.datetime(2023, 12, 31, 23, 59, 59)
print(repr(dt))
print(str(dt))[1, [2, [3, 4], 5], [6, 7]] datetime.datetime(2023, 12, 31, 23, 59, 59) 2023-12-31 23:59:59
Различие между контейнерами, которые вызывают repr() или str() для своих элементов.
class VerboseStr:
def __str__(self):
return "STR"
def __repr__(self):
return "REPR"
vs = VerboseStr()
print(vs) # str
print([vs]) # repr для элементов списка
print({vs}) # repr для элементов множестваSTR
[REPR]
{REPR}