我有以下 python 命令:
>>> list([0, 1])
[0, 1]
>>> list(myobject)
[0, 1]
>>> print(['{:.2f}'.format(val) for val in list([0, 1])])
['0.00', '1.00']
>>> print(['{:.2f}'.format(val) for val in list(myobject)])
TypeError: non-empty format string passed to object.__format__
为什么list([0, 1])
和list(myobject)
返回相同的列表[0, 1]
code>,格式化一个可以工作,而格式化另一个则不行?
如果有帮助的话,有问题的myobject
是一个sympy.geometry.Point
最佳答案
仅仅因为列表中的值以相同的方式打印并不意味着它们可以以相同的方式格式化。 sympy.geometry.Point
包含 sympy.core.number.*
objects ,不是 Python 数字:
>>> from sympy import Point3D
>>> myobject = Point3D(1, 2, 2)
>>> type(myobject.x)
<class 'sympy.core.numbers.One'>
这会起作用:
>>> print(['{!r}.00'.format(val) for val in myobject])
因为然后您首先对 myobject
中的每个值应用 repr()
。以下内容也将起作用,但随后将应用任意对象的标准格式:
>>> print(['{}.00'.format(val) for val in myobject])
(我在两个示例中删除了 list()
调用,因为它在这里是多余的)。
myobject
生成的值可能有一个自定义的 __repr__
方法,该方法将值作为字符串数字返回。它们缺少的是自定义的 __format__ 方法,并且继承的默认的 object.__format__ 拒绝接受格式化参数。
要实际将对象格式化为 float ,请先将它们转换为:
print(['{:.2f}'.format(float(val)) for val in myobject])
演示:
>>> print(['{!r}.00'.format(val) for val in myobject])
['1.00', '2.00', '2.00']
>>> print(['{}.00'.format(val) for val in myobject])
['1.00', '2.00', '2.00']
>>> print(['{:.2f}'.format(float(val)) for val in myobject])
['1.00', '2.00', '2.00']
关于python - 对于看似相同的列表,格式有不同的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41566382/