考虑以下函数:
>>> 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
在后台创建了一个会被覆盖的类,那么我以后可能会看到一些潜在的奇怪行为。这样做有什么副作用/陷阱吗?
可选信息:
如果你想知道我到底在做什么会让我编写这段代码,我有一个返回有点类似dict
结果的 ORM。我已经看到对象在赋值时表现得很奇怪,我真的不想传递可能有或可能没有能力修改我的数据库的对象(取决于查询代码的编写方式)。尝试为每个查询维护 DTO 对象似乎太麻烦了,尝试使我的所有查询与一小组 DTO 兼容也是如此。所以我想出了一个快速、简单的方法来传递明显不可变的对象,我可以在其中编写类似dto.a
. 它本质上是一个动态的、动态的 DTO 生成器。它还repr
为我在调试时购买了一个相当不错的实现。