我試圖寫一個漂亮的打印程序,我在其中使用幾個包含浮點對的命名元組的程序,我遇到了這個問題。不能使用部分作爲__str__
from collections import namedtuple
Position = namedtuple('Position', 'x y')
Vector = namedtuple('Vector', 'x y')
Size = namedtuple('Size', 'width height')
我想格式化浮點數打印,因爲結果的時候:
import math
print(Position(math.pi, math.pi), Vector(math.pi, math.pi), Size(math.pi, math.pi))
過長:
Position(x=3.141592653589793, y=3.141592653589793) Vector(x=3.141592653589793, y=3.141592653589793) Size(width=3.141592653589793, height=3.141592653589793)
所以我創建了一個函數來打印指定的元組:
def pretty_float_pair(name, labels, obj):
"""
If labels = ('a', 'b') and object = (1.2345, 1.2345) returns:
'name(a=1.23, b=1.23)'
"""
return '{}({}={:.2f}, {}={:.2f})'.format(name, labels[0], obj[0], labels[1], obj[1])
應該爲每個類型固定名稱和標籤,只有obj參數不同,所以我想我可以使用functools部分。
from functools import partial
Position.__str__ = partial(pretty_float_pair, 'Position', ('x', 'y'))
Vector.__str__ = partial(pretty_float_pair, 'Vector', ('x', 'y'))
Size.__str__ = partial(pretty_float_pair, 'Size', ('width', 'height'))
print(Position(math.pi, math.pi), Vector(math.pi, math.pi), Size(math.pi, math.pi))
但是,這將引發TypeError: pretty_float_pair() missing 1 required positional argument: 'obj'.
令人驚訝的,如果我使用lambda來創建它的工作職能。
Position.__str__ = lambda x: pretty_float_pair('Position', ('x', 'y'), x)
Vector.__str__ = lambda x: pretty_float_pair('Vector', ('x', 'y'), x)
Size.__str__ = lambda x: pretty_float_pair('Size', ('width', 'height'), x)
print(Position(math.pi, math.pi), Vector(math.pi, math.pi), Size(math.pi, math.pi))
打印我想要的東西:
Position(x=3.14, y=3.14) Vector(x=3.14, y=3.14) Size(width=3.14, height=3.14)
我試圖理解爲什麼部分版本無法正常工作。
你的功能不正常縮進。請修復。你可以用我的答案作爲參考。 –
即使你的問題已經結束,你應該從已發佈的答案中選擇一個答案(假設它對你有幫助)。 –