我使用一组
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".
您可以像这样使用类作为类型提示
class Identifier:
def __init__(self, key, value):
self.key = key
self.value = value
def func(anyidentifier: Identifier):
print(anyidentifier.key)
print(anyidentifier.value)
然后为特定标识符创建类的实例