python - 对于看似相同的列表,格式有不同的行为

标签 python string list formatting sympy

我有以下 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/

相关文章:

html - 替换除链接之外的所有文本

java - 在java中使用 "%"、 "?"和 "#"查找子字符串

c - 双链表: swapping function doesn't always work

python - 移动值但保留 Python 列表中的顺序

r - 无需输入每个对象的名称两次即可构建命名列表

python - 在分组的 Pandas 数据框中的最大值后删除行

python - QML 中对象 id 的引用

python - 在不留下孤儿的情况下从 python/bash 中杀死子进程

python - Pyqt5 QTreeWidget CurrentItemChanged 信号发送整数作为前一项

python - 用到目前为止出现的次数替换字符串的每次出现