У меня есть несколько пользовательских python объектов с пользовательскими __repr__()
функциями. Каждый из них использует f-строки для генерации вывода str
. Один из объектов содержит другие пользовательские объекты, поэтому repr
s внутри его repr
.
. repr
родительского объекта объявлен так:
def __repr__(self):
return f'Lexc(multichars={repr(self.multichar_symbols)}, {len(self.lexicons)} lexicons)'
__repr__
для класса self.multichar_symbols
выглядит следующим образом:
def __repr__(self):
return f'MulticharSymbols({len(self.symbols)} symbols, {len(self.lines)} lines)'
Вот вопрос. Я ожидал бы, что следующий код будет выдавать один и тот же вывод три раза подряд, но, как вы можете видеть, f-строка и __repr__()
выдают полный repr
, а repr()
- усеченный repr
(со вставкой ...
).
print(f'{lexc!r}')
print(lexc.__repr__())
print(repr(lexc))
print()
print(f'{lexc.multichar_symbols!r}')
print(lexc.multichar_symbols.__repr__())
print(repr(lexc.multichar_symbols))
Lexc(multichars=MulticharSymbols(187 symbols, 190 lines), 2611 lexicons)
Lexc(multichars=MulticharSymbols(187 symbols, 190 lines), 2611 lexicons)
Lexc(multicha...2611 lexicons)
MulticharSymbols(187 symbols, 190 lines)
MulticharSymbols(187 symbols, 190 lines)
MulticharSymb...ls, 190 lines)
К сожалению, мне не удалось свести это поведение к минимальному рабочему примеру, поэтому отчасти вопрос в том, какой механизм может быть причиной этого. Документация для f-строк гласит, что ...
Если указано преобразование, результат вычисления выражения преобразуется перед форматированием. Преобразование '!s'
вызовов str()
на результат, '!r'
вызовов repr()
и '!a'
вызовов ascii()
.
Если бы это было так, то результаты должны быть идентичны , Документация для repr()
и __repr__()
не содержит какой-либо соответствующей информации.
Почему repr()
приводит к усеченным результатам до 30 символов, и как я могу воссоздать это поведение на минимальном примере?