Вывод интерпретатора 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() к объектам, я не знаю.

Другие вопросы по тегам