我的模型类必须提供大量查询,我想将查询结果返回为namedtuple。我的解决方案有效,但我不知道为什么:) - 所以我想得到一些澄清,这是否是一个好的或有效的设计 - 或不是。
简化的示例代码:
class SomeModel():
def query01(self):
Row = namedtuple("Row", "a")
row = Row("a1")
return row
def query02(self):
Row = namedtuple("Row", "a b c")
row = Row(1,2,3)
return row
sample = SomeModel()
item01 = sample.query01()
item02 = sample.query02()
print(item01)
print(item02)
输出完全符合预期:
Row(a='a1')
Row(a=1, b=2, c=3)
现在是意想不到的......
print(type(item01))
print(type(item02))
将提供:
<class '__main__.Row'>
<class '__main__.Row'>
如果我将函数中的命名元组替换为本地类,则类型将如预期所示:
<__main__.query01.<locals>.Row at 0x11073eb30>
<__main__.query02.<locals>.Row at 0x11073fcd0>
最后我的问题:
与类相比,我更喜欢
namedtuple
方法,它的工作原理与预期一致,但感觉有点奇怪,类型名称完全相同。当类型名称相同时,Python 如何区分这两个项目?本地类的命名约定对我来说更有意义。以这种方式使用namedtuple安全吗?
您可能会说我可以在函数中使用不同的命名元组名称,但对于大量查询,您无法保证名称始终是唯一的。
它们不相同:
如果添加:
print(type(item01) is type(item02))
它将打印
False
。
注意,这就是为什么你应该小心不要为元组的每个实例重新创建一个namedtuple类。
Row = namedtuple("Row", "a b c")
应位于 模块级别。