【问题标题】:Output of Python interpreter?Python解释器的输出?
【发布时间】:2014-11-07 10:07:20
【问题描述】:

使用Python解释器时,只写

3+4

导致它打印“7”

但是当导入一些类('Something',它有自己的 stradd 实现)并执行以下操作时:

a=Something(var2)
b=Something(var2)
a+b

解释器只是打印一条消息报告该操作(编辑:我的意思是消息类。位于 0xspam 的某物对象...,它是 repr 实际未实现时的输出,当我认为我会得到类似 str) 的输出时,它不会打印刚刚创建的新对象的 str 版本

为什么会这样?怎么改?

编辑: 问题与 strrepr 所做的混淆有关(当我问这个问题时,我不知道 repr 存在) ,我认为对于一个类来说,实现 str 既能够从对象获取字符串,又能够将其直接打印到解释器而无需编写“打印”就足够了。但后者实际上是通过适当地实施 repr 来完成的

【问题讨论】:

  • 什么是“报告操作的消息”?通常,解释器不会打印任何此类内容。它只打印提示、结果的 repr 和异常的回溯。
  • “报告操作的消息”是指repr 的结果,但直到现在我才知道repr,这就是我最初的问题的答案。谢谢大家。
  • 我不确定这是不是一个骗局,但你一定要阅读Difference between str and reprrepr 上的规范问题。

标签: python class object interpreter


【解决方案1】:

这是一个实现了自己的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>

【讨论】:

  • 非常感谢!这正是我想要的,我知道一定有一些我缺少的功能。
【解决方案2】:

以下是解释器使用的规则:

对于除表达式语句之外的任何内容,都不会打印任何内容。

对于一个表达式语句,结果赋值给_,那么就发生了相当于这段代码的情况:

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__是一个单独的函数,如果您只是继承默认值,它往往看起来像&lt;__main__.Spam at 0x115f018d0&gt;

【讨论】:

  • @Jumpingcat:在那种情况下,我认为 John1024 的回答可能更像是一个直接的解决方案。但是,请编辑您的问题,这样我们就不必准确猜测您要问的是什么。
  • 对不起,我会编辑它,我不太清楚如何表达我的问题。
  • @Jumpingcat:不,不要编辑它说“已解决”,编辑它来回答你被问到的问题。向我们准确展示您输入的内容和得到的输出,而不是试图描述它。
  • 再次抱歉!我现在描述了,希望没问题。
  • @Jumpingcat Stackoverflow 的习俗与其他地方有些不同。如果您想更好地理解,阅读以下内容可能会有所帮助:"What should I do when someone answers my question?"
【解决方案3】:

当然是print a+b 而不仅仅是a+b

至于为什么 a+b 不会导致 str() 在对象上被调用,我不知道。

【讨论】:

  • 当然,我知道怎么做,但我问的是为什么这两个对象不同。
猜你喜欢
  • 1970-01-01
  • 2019-11-11
  • 1970-01-01
  • 2013-07-14
  • 2020-09-29
  • 2019-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多