次の関数を検討してください。
>>> from collections import namedtuple
>>> def make_thing(**kwargs):
... ThingClass = namedtuple('ThingClass', kwargs.keys())
... return ThingClass(**kwargs)
...
>>> make_thing(x=1,y=2,z=3)
ThingClass(y=2, x=1, z=3)
>>> make_thing(a=4,b=5,c=6)
ThingClass(a=4, c=6, b=5)
>>>
この関数は、入力のキーnamedtuple
と同じフィールド名を持つ「一時的な」クラスを生成するために呼び出します。dict
次に、値が入力されたインスタンスを返します。
typename
私の質問は、フィールド名が異なっていても、への引数namedtuple
が常に同じであるため、これに特定の落とし穴があるかどうかです。たとえば、namedtuple
これを行うことによってオーバーライドされるクラスをバックグラウンドで作成した場合、後で奇妙な動作が発生する可能性があることがわかりました。これを行うための副作用/落とし穴はありますか?
オプション情報:
私が一体何をしていて、このコードを書く必要があるのか疑問に思っているなら、私は ORM を持っていdict
ます。オブジェクトが代入で奇妙に動作するのを見たことがありますが、(クエリ コードの記述方法によっては) データベースを変更する機能がある場合とない場合があるオブジェクトを渡したくありません。すべてのクエリに対して DTO オブジェクトを維持しようとするのは面倒に思えます。また、すべてのクエリを少数の DTO セットと互換性を持たせようとするのと同様です。だから私はこれを思いついたdto.a
. これは本質的に動的なオンザフライの DTO ジェネレーターです。また、repr
デバッグ中のためのかなり優れた実装が得られます。