2017-01-10 7 views
1

ごとに異なる振る舞いを持っていますフォーマットは、私は次の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)が他方をフォーマットすることはないながら、1つの作品をフォーマットする、同じリスト[0, 1]を返すということです?

ことができます場合は、問題のmyobjectでリスト印字値が同じように、彼らは同じようにフォーマットすることができるという意味ではありませんという理由だけでsympy.geometry.Point

答えて

1

です。その後、あなたはmyobject最初に各値にrepr()を適用するため

>>> print(['{!r}.00'.format(val) for val in myobject]) 

>>> from sympy import Point3D 
>>> myobject = Point3D(1, 2, 2) 
>>> type(myobject.x) 
<class 'sympy.core.numbers.One'> 

これは動作します:sympy.geometry.PointはないPythonの番号、sympy.core.number.* objects含まれています。以下も動作するが、その後、任意のオブジェクトのためのフォーマット規格が適用される:

>>> print(['{}.00'.format(val) for val in myobject]) 

(それはここでは冗長であるように、私は両方の例でlist()コールを除去しました)。

myobjectによって得られた値は、おそらく値を文字列桁として返すカスタムの方法を持っています。彼らが欠けているものはカスタム__format__メソッドであり、継承されるデフォルトのobject.__format__はフォーマットパラメータを受け入れることを拒否します。

は、実際には最初にそれらを変換し、山車などのオブジェクトをフォーマットするには:

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'] 
+0

おかげでたくさん!私は10進形式を望んでいたので、リスト(vertex.evalf())のvalにformat(val)を '' {:.2f} 'で使用しました。 – Woofas

関連する問題