具有相同类型名称的不同命名元组的有害副作用?

时间:2013-07-29 10:38:06

标签: python namedtuple

考虑以下功能:

>>> 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的{​​{1}}参数始终是相同的,即使有不同的字段名称。例如,如果namedtuple在后​​台创建了一个可以通过执行此操作而被覆盖的类,那么我可以看到一些可能会在以后出现的奇怪行为。这样做是否有任何副作用/陷阱?

可选信息:

如果你想知道我正在做什么,那将会让我编写这段代码,我有一个ORM返回namedtuple - 就像结果一样。我已经看到对象在赋值时表现得很奇怪,而且我真的宁愿不传递可能或者可能没有能力修改数据库的对象(取决于查询代码的编写方式)。尝试为每个查询维护DTO对象似乎太麻烦了,尝试使我的所有查询都与一小组DTO兼容。所以我想出了一个快速,简单的方法来传递明显不可变的对象,我可以编写像dict这样的代码。它本质上是一个动态的动态DTO发生器。当我调试时,它还为我买了一个相当不错的dto.a实现。

1 个答案:

答案 0 :(得分:3)

没有陷阱,这些课程没有集中注册。

您所看到的是使用self.__name__生成表示字符串的类。这些类本身仅作为实例的.__class__引用,因为当make_thing()函数完成时,本地名称被清除。