Python 如何区分命名元组的类型名称?

问题描述 投票:0回答:1

我的模型类必须提供大量查询,我想将查询结果返回为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安全吗?

您可能会说我可以在函数中使用不同的命名元组名称,但对于大量查询,您无法保证名称始终是唯一的。

python namedtuple
1个回答
0
投票

它们不相同

如果添加:

print(type(item01) is type(item02))

它将打印

False

注意,这就是为什么你应该小心不要为元组的每个实例重新创建一个namedtuple类

Row = namedtuple("Row", "a b c")

应位于 模块级别

© www.soinside.com 2019 - 2024. All rights reserved.