【发布时间】:2022-01-21 22:13:25
【问题描述】:
对象 A、B ... 具有属性 namespace,我有一个函数可以通过 namespace 属性的特定值集过滤此类对象列表:
T = TypeVar('T')
def filter(seq: list[T], namespace_values: set[str]) -> list[T]:
# Returns a smaller list containing only the items from
# `seq` whose `namespace` are in `namespace_values`
...
这很好用,但它允许传递不具有属性 namespace 的 X 类型的对象而不会出现任何检查错误。
然后我创建了一个协议并更改了功能以使用该协议:
class Namespaced(Protocol):
namespace: str
def filter(seq: list[Namespaced], namespace_values: set[str]) -> list[Namespaced]:
# Returns a smaller list containing only the items from
# `seq` whose `namespace` are in `namespace_values`
...
现在,如果我通过 X 的列表(这是我想要的),我会收到一个检查错误,但我丢失了泛型:
list_of_a: list[A] = [a1, a2, a3]
output = filter(list_of_a, ['ns1', 'ns2'])
# output is list[Namespaced] instead of list[A]
如何结合泛型和协议,以便我的函数返回类型 T 的列表并检查 seq 的项目是否实现 Namespaced 协议?
我尝试了以下方法,但 T 丢失了。
def filter(seq: list[Namespaced[T]], namespace_values: set[str]) -> list[T]:
# Returns a smaller list containing only the items from
# `seq` whose `namespace` are in `namespace_values`
...
干杯!
【问题讨论】:
-
注意,
namespace_values: set(str)不是一个有效的类型注解,你的意思是namespace_values: set[str] -
@juanpa.arrivillaga 谢谢!我编辑了。
标签: python generics protocols python-typing