Почему repr (a) усекает .__ repr __ (), а f '{a! R}' нет? - PullRequest
0 голосов
/ 19 марта 2020

У меня есть несколько пользовательских 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 символов, и как я могу воссоздать это поведение на минимальном примере?

...