浮動小数点のペアを含む複数の名前付きタプルを使用するプログラムのためのきれいな印刷手順を作成しようとしているときに、この問題が発生しました。partialを__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 partialを使うことができると考えました。
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'.
をスローします。私が望んで
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)
私は部分的なバージョンが動作しない理由を理解しようとしています。
あなたの機能が適切に字下げされません。修正してください。私の答えを参照のために使うことができます。 –
あなたの質問は閉鎖されましたが、投稿された質問の中から回答を選択する必要があります。 –