python交互模式中的备用错误和无错误

时间:2011-11-15 02:36:00

标签: python

使用文件xx.py:

class Foo(object):
    def __init__(self, x):
        self.x = x

    def __long__(self):
        return long(self.x)

    def __float__(self):
        return float(self.x)


y = Foo(22)

print '%d' % y
print '%d' % y

互动模式:

$ python -V
Python 2.6.7

$ python -i xx.py 
22
22
>>> 
TypeError: int() argument must be a string or a number, not 'Foo'
>>> '%d' % y
'22'
>>> '%d' % y
TypeError: int() argument must be a string or a number, not 'Foo'
>>> '%d' % y
'22'
>>> '%d' % y
TypeError: int() argument must be a string or a number, not 'Foo'

为什么它在印刷' 22'之间交替?并引发TypeError?

为什么它会在第一次回车时引发错误(没有输入)?

感谢。

2 个答案:

答案 0 :(得分:2)

看起来像是python中的一个bug!我的猜测是它是由旧的基于字符串的异常中的一些遗留问题造成的。

十六进制的东西是一个红色的鲱鱼,你也可以通过简单地分配y = Foo(1)来获得奇怪的行为,只需使用'%d' % y就可以展示出有趣的切换内容。

应该 在脚本的第一个print '0x%x' % y处获得TypeError,因为该部分没有明确定义。但不知怎的,结果被强制,看起来像一个基于字符串的异常以某种方式得到......错过了,当它可能应该变成TypeError时。

如果这个字符串替换的东西是错误的,那么再转换到字符串格式化的首选新方法的另一个原因是,例如print '{0:x}'.format(22)

答案 1 :(得分:1)

我知道你为什么收到错误信息,这是因为你没有为类定义__int__方法,该方法用于很多方面,包括通过{{的旧式字符串格式化1}}。我似乎记得int()只适用于拥有int()方法的数字类型,字符串和对象(尽管可能还有其他我忘记的方法)。

添加:

__int__()

到您的班级定义,然后错误消失。

如果您只想让错误消失,那就是您需要做的一切。


确定的原因是您在 alternate 运行时遇到错误。实际上,您不必在备用运行中执行任何操作,按ENTER键将导致错误,与启动时相同:

def __int__(self):
    return int(self.x)