Как Python repr работает с классами и экземплярами

Мне любопытно, как работает repr. Это не может быть точно

def repr_(x):
  return x.__repr__()

так как это не работает на классах, а именно

repr_(int)

вызывает ошибку, так как представление int ожидает объект int в качестве первого аргумента. Я знаю, что могу настроить repr класса, создав метакласс с желаемым __repr__, но я хочу знать, как работает встроенный в Python repr? И как он конкретно обрабатывает случай передачи класса в него.

Делает ли он что-то вроде try catch, где он сначала пробует то, что делает мой repr_, а затем ищет MRO для других повторов? Или что-то другое?


person Enrico Borba    schedule 20.04.2019    source источник
comment
Попробуйте repr_(3) вместо типа int, который не является экземпляром.   -  person barny    schedule 20.04.2019
comment
Я не эксперт, но help(repr) говорит следующее: For many object types, including most builtins, eval(repr(obj)) == obj.   -  person wjandrea    schedule 20.04.2019


Ответы (3)


Догадаться. Если мы проверим, как Python внутренне вычисляет repr, что мы можем увидеть в исходном файле object.c, мы можем видеть, что repr по существу

def repr_(x):
  return x.__class__.__repr__(x)
person Enrico Borba    schedule 20.04.2019

импорт даты и времени

сегодня=дата/время.дата.сегодня()

печать (репр (сегодня))

для объектов классов repr в основном отображает однозначный вывод, когда вызов obj является их.

person Ritik Sharma    schedule 20.04.2019

Документация https://www.cmi.ac.in/~madhavan/courses/prog2-2015/docs/python-3.4.2-docs-html/library/functions.html#repr

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

person Pravin    schedule 20.04.2019
comment
Я понимаю, что означает repr и что он должен делать. Я понимаю, как настроить repr для пользовательских классов, используя собственный метакласс. Я хочу знать, как Python внутренне решает, что __repr__ вызывать. - person Enrico Borba; 20.04.2019
comment
stackoverflow.com/questions/5356773/ Проверьте это, это может вам помочь. - person Pravin; 20.04.2019