2

序文

Pythonicな方法でデータクラスを概念化する方法を考えていました。具体的には、DTO ( Data Transfer Object .)について話しています。

@jeff-oneill の質問「<a href="https://stackoverflow.com/questions/3357581/using-python-class-as-a-data-container/">Using Python class as a @joe-kington は組み込みのnamedtuple.

質問

Python 2.7 ドキュメントのセクション 8.3.4 には、複数の名前付きタプルを組み合わせる方法の良い例があります。私の質問は、逆を達成する方法ですか?

ドキュメントの例を考慮してください:

>>> p._fields            # view the field names
('x', 'y')

>>> Color = namedtuple('Color', 'red green blue')
>>> Pixel = namedtuple('Pixel', Point._fields + Color._fields)
>>> Pixel(11, 22, 128, 255, 0)
Pixel(x=11, y=22, red=128, green=255, blue=0)

「Pixel」インスタンスから「Color」または「Point」インスタンスを推測するにはどうすればよいですか?

できればパイソンの精神で。

4

5 に答える 5

4

ここにあります。ちなみに、この操作が頻繁に必要な場合はcolor_ins、 を元に作成用の関数を作成するとよいでしょうpixel_ins。または、任意の subnamedtuple に対しても!

from collections import namedtuple

Point = namedtuple('Point', 'x y')
Color = namedtuple('Color', 'red green blue')
Pixel = namedtuple('Pixel', Point._fields + Color._fields)

pixel_ins = Pixel(x=11, y=22, red=128, green=255, blue=0)
color_ins = Color._make(getattr(pixel_ins, field) for field in Color._fields)

print color_ins

出力:Color(red=128, green=255, blue=0)

任意の subnamedtuple を抽出する関数 (エラー処理なし):

def extract_sub_namedtuple(parent_ins, child_cls):
    return child_cls._make(getattr(parent_ins, field) for field in child_cls._fields)

color_ins = extract_sub_namedtuple(pixel_ins, Color)
point_ins = extract_sub_namedtuple(pixel_ins, Point)
于 2017-02-21T14:18:27.820 に答える