Вывод интерпретатора Python?
При использовании интерпретатора Python просто пишите
3+4
заставляет его печатать "7"
Но при импорте некоторого класса ("Something", в котором реализована собственная строка str и add), сделайте следующее:
a=Something(var2)
b=Something(var2)
a+b
Интерпретатор просто печатает сообщение, сообщающее о действии (РЕДАКТИРОВАТЬ: под этим я имел в виду объект class.Something в 0xspam..., который является выводом repr, когда он на самом деле не реализован, когда я думал, что получу что-то вроде вывод str), он не печатает версию str нового объекта, который был только что создан
Почему это происходит? Как это можно изменить?
РЕДАКТИРОВАТЬ: проблема была связана с путаницей в отношении того, что делают str и repr (я не знал об этом repr существовал, когда я задавал вопрос), я думал, что было достаточно для класса, чтобы str был реализован так, чтобы оба могли получить строка из объекта и возможность печатать ее непосредственно в интерпретаторе без необходимости писать 'print'. Но последнее - это то, что на самом деле делается путем соответствующей реализации repr
3 ответа
Вот класс со своим add
внедрено:
class A(object):
def __init__(self, x):
self.x = x
def __add__(self, other):
return self.__class__(self.x + other.x)
def __repr__(self):
return "%s with x=%s" % (self.__class__, self.x)
Теперь давайте создадим несколько экземпляров и добавим их:
>>> a = A(3); b = A(2)
>>> a + b
<class 't.A'> with x=5
Да, это печатает.
Без обычая __repr__
как определено выше, то, что печатает, будет обычным представлением по умолчанию, таким как:
<t.A object at 0x7f7d7bc9f990>
Вот правила, которые использует переводчик:
Для чего-либо, кроме выражения выражения, ничего не печатается.
Для оператора выражения результат присваивается _
, тогда происходит эквивалент этого кода:
if _ is not None:
try:
print(repr(_))
except Exception as e:
print(<some message with e and object.__repr__(_)>)
Это действительно все, что нужно сделать.
Таким образом, если ничего не печатается, наиболее вероятная возможность состоит в том, что a+b
возвращается None
Вот. Например, что Something.__add__
что вы забыли показать нам, может выглядеть так:
def __add__(self, other):
tmp = copy.copy(self)
tmp += other
# oops, no return tmp
Или, может быть a+b
возвращает объект, чей repr
пустая строка или все пробелы, и вы не заметили, что она напечатала пустую строку.
Если что-то печатается, но это не то, что вы ожидали, то, вероятно, __repr__
не определяется так, как вы ожидали. Поскольку вы упоминаете только определение __str__
Вы можете не осознавать, что __repr__
это отдельная функция, и если вы просто наследуете по умолчанию, она имеет тенденцию выглядеть <__main__.Spam at 0x115f018d0>
,
print a+b
вместо просто a+b
, конечно
Что касается почему a+b
не вызывает str() к объектам, я не знаю.