代码之家  ›  专栏  ›  技术社区  ›  gen

任意列表的python类型注释?

  •  0
  • gen  · 技术社区  · 7 年前

    我想注释一个函数的参数,以表明期望一个列表作为参数。但是,我想保持列表的基类型未指定。有办法吗?使用如下占位符?

    def my_func(li: List[any])
    

    编辑 是否可以使用模板:

    例如:

    def union(li: List[List[T]])-> List[T]: 
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   abarnert    7 年前

    但是,我想保持列表的基类型未指定。有办法吗?使用如下占位符?

    def my_func(li: List[any])
    

    对。但是你想要 Any 以下内容:

    表示无约束类型的特殊类型。

    • 每种类型都与 任何 是的。
    • 任何 与所有类型兼容。

    是否可以使用模板:

    例如:

    def union(li: List[List[T]])-> List[T]: 
    

    对。尽管这些被称为 generics 不是模板(因为它们实际上不是像C++模板那样提供图灵完整的编译时语言),它们只是简单的泛型类型。

    唯一的问题是泛型类型需要类型变量,并且没有名为 T . 但是很容易创建一个,如文档所示,当然 T型 是传统的“第一个泛型参数”类型变量:

    T = TypeVar('T')
    

    然后你可以使用它:

    定义联合(li:list[list[t]])->list[t]:
    

    如果你已经知道C++模板或者Haskell参数化的类型或者Java泛型或者什么,那么你就可以跳进去开始写python类型注解,假设你能猜出它们的意思。但实际上,你至少需要阅读 the docs ,或 PEP 483 以及其他相关的政治公众人物。否则,你会猜出各种各样的错误(不仅仅是 任何 被调用以及如何声明 TypeVar 可能还有 Tuple 是,协方差是如何工作的,哪些泛型类型是在结构上检查的,而哪些是在名义上检查的,等等。


    当我们在做的时候,除非你真的需要 List ,你可能想要 Sequence[Sequence[T]] Iterable[Sequence[T]] 或类似的。

    你可以在 Classes, functions, and decorators 但总的来说 collections.abc 似乎应该有一个通用的 typing 做。