通用`NamedTuple`

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

我使用一组

NamedTuple
,它们具有两个共同属性(
key
value
),例如:

CompanyIdentifier = NamedTuple("CompanyIdentifier", [
    ("key", str), ("value": str), ("some", str), ("other", str), ("fields", str)])

PeopleIdentifier = NamedTuple("PeopleIdentifier", [
    ("key", str), ("value": str), ("yet", str), ("another", str), ("field", str)])

WhateverIdentifier = NamedTuple("WhateverIdentifier", [
    ("key", str), ("value": str)])

我无法控制所有这些可能的

NamedTuple
,图书馆的用户可以自由创建自己的等等。

现在我已经创建了许多函数来操作这些类,让我们考虑一个虚拟示例:

def print_identifier(i: ???):
    print(i.key)
    print(i.value)

我知道

print_identifier
可以适用于任何具有
NamedTuple
key
字段的
value
,但我很难向类型提示系统表达这一点。

我尝试创建某种最小公分母标识符

NamedTuple
,例如:

AnyIdentifier = NamedTuple("AnyIdentifier", [("key", str), ("value": str)])

但是当我尝试提供特定的真实标识符时,mypy和pyright会抱怨真实标识符与

AnyIdentifier
不兼容:

from typing import NamedTuple

CompanyIdentifier = NamedTuple(
    "CompanyIdentifier",
    [
        ("key", str),
        ("type", str),
        ("some", str),
        ("other", str),
        ("field", str),
    ],
)

AnyIdentifier = NamedTuple(
    "AnyIdentifier",
    [
        ("key", str),
        ("value", str),
    ],
)


def func(identifier: AnyIdentifier):
    print(identifier.key)
    print(identifier.value)


ci = CompanyIdentifier(key="K", value="V", some="S", other="O", field="F")
gi = AnyIdentifier(key="K", value="V")

func(gi)
func(ci) # <- Error
Argument of type "CompanyIdentifier" cannot be assigned to parameter "identifier" of type "AnyIdentifier" of function "func".
    "CompanyIdentifier" is incompatible with "AnyIdentifier".
python mypy type-hinting namedtuple pyright
1个回答
-1
投票

您可以像这样使用类作为类型提示

class Identifier:
    def __init__(self, key, value):
        self.key = key
        self.value = value

def func(anyidentifier: Identifier):
    print(anyidentifier.key)
    print(anyidentifier.value)

然后为特定标识符创建类的实例

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