3

次の関数を検討してください。

>>> 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デバッグ中のためのかなり優れた実装が得られます。

4

1 に答える 1

3

落とし穴はありません。クラスは一元的に登録されていません。

self.__name__表示されるのは、表現文字列を生成するために使用するクラスだけです。関数が終了.__class__するとローカル名がクリアされるため、クラス自体はインスタンスの参照としてのみ存続します。make_thing()

于 2013-07-29T10:40:24.043 に答える