【问题标题】:Python type annotation for arbitrary list?任意列表的Python类型注释?
【发布时间】:2018-12-24 13:42:46
【问题描述】:

我想对函数的参数进行注释,以指示列表应作为参数。但是,我想保持未指定列表的基本类型。有没有办法做到这一点?即使用如下的占位符?

def my_func(li: List[any])

编辑是否可以使用模板:

比如:

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

【问题讨论】:

  • 几乎是对的,但你想要的是Any,而不是any。 (或者你可以只使用List 而不使用任何元素规范。)
  • 这只是一个错字,所以我们应该关闭这个问题,或者你需要一些解释吗?
  • 嗯,我是 python 的新手,所以这是一个真正的问题,即我什至不知道 Any 是什么。另请参阅我的编辑。
  • 供您编辑:是的,可以这样做,只要您事先完成了T = TypeVar('T')。这在the docs 和 PEP 中都有介绍,您将需要阅读其中一个或另一个,而不仅仅是尝试猜测语法。
  • 附带说明一下,您真的要专门要求List,而不是任何SequenceIterable

标签: python types syntax type-hinting


【解决方案1】:

但是我想保持未指定列表的基本类型。有没有办法做到这一点?即使用如下占位符?

def my_func(li: List[any])

是的。但是你想要Any:

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

  • 每种类型都与Any 兼容。
  • Any 兼容所有类型。

是否可以使用模板:

比如:

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

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

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

T = TypeVar('T')

……然后你就可以使用它了:

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

如果您已经了解 C++ 模板或 Haskell 参数化类型或 Java 泛型或其他任何东西,那么假设您可以猜到它们的含义,那么很容易跳入并开始编写 Python 类型注释。但实际上,您至少需要阅读 the docsPEP 483 的前几节以及其他各种相关的 PEP。否则,你会猜出各种各样的错误(不仅仅是Any被调用以及如何声明TypeVars,还可能Tuple的参数是什么,协方差如何工作,哪些泛型类型在结构上与名义上进行检查,等等。


当我们这样做时,除非您确实需要输入为 List,否则您可能需要 Sequence[Sequence[T]]Iterable[Sequence[T]] 或类似名称。

您可以在 Classes, functions, and decorators 中找到所有详细信息,但一般来说,来自 collections.abc 的任何内容似乎应该在 typing 中具有通用对应项。

【讨论】:

    猜你喜欢
    • 2021-08-03
    • 2021-03-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 2021-11-12
    • 2021-12-11
    • 2021-09-10
    相关资源
    最近更新 更多