使用文件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?
为什么它会在第一次回车时引发错误(没有输入)?
感谢。
答案 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)