如何正确地为字符串列表进行注解/类型提示

9 浏览
0 Comments

如何正确地为字符串列表进行注解/类型提示

我正在尝试弄清楚如何正确地对字符串列表进行注释或类型提示。例如,如果我有一个像这样的函数:\n

def send_email(self, from_address: str, to_addresses: list[str]):
    pass

\nto_addresses 应该是一个字符串列表。但是当我尝试使用这个注释时,在我的Python 3.4.3解释器中会出现以下错误:\nTypeError: \'type\' object is not subscriptable\n我确定问题是由于 list[str],因为如果我将其更改为 str,错误就会消失,但这不会正确地反映出我的参数意图。

0
0 Comments

Python 3.9版本引入了一种新的语法,允许在类型注释中直接使用内置的集合类型,如list和dict,而无需从typing模块中导入对应的大写类型(List或Dict)。这种新的语法可以通过使用from __future__ import annotations导入的方式在Python 3.7+版本中使用。但需要注意的是,这个导入只影响类型注释,而不影响其他上下文中的语法。

在Python 3.8版本中,可以使用from __future__ import annotations导入来启用这个行为,否则只能使用typing.List来注释列表类型。然而,一些用户报告称,在3.8.5版本中使用这个导入后,仍然会出现"'type' object is not subscriptable"错误,这是因为这种语法只能用作类型注释,而不能用作值。

因此,要正确地对字符串列表进行类型注释,可以根据Python版本选择不同的方法。在3.9+版本中,可以直接使用list[str]来注释。在3.7+版本中,可以使用from __future__ import annotations来启用这个新的语法。在3.8版本中,只能使用typing.List进行注释。需要注意的是,这种新的语法只影响类型注释,而不影响其他上下文中的代码。

0
0 Comments

在Python 3.9+中,可以在类型注释中使用小写字母"list",代码将正常工作。但在旧版本的Python中,需要导入"typing.List"并使用它代替。

from typing import List
to_addresses: List[str]

需要注意的是,这里的"List"首字母需要大写。

你可能希望考虑使用更具体的类型,例如:

import typing
Address = typing.NewType("Address")

参考"NewType文档"。

静态类型检查器将把新类型视为原始类型的子类。

为什么"from_address"是一个str,而"to_addresses"是一个list[str]呢?因为你可以将电子邮件发送给多个地址,但不能在"From:"字段中放置多个电子邮件。

0
0 Comments

问题的原因是在Python 3.4中,函数注释的格式没有明确规定,只是提供了一种机制,允许您将任何表达式用作注释。注释的解释方式取决于您和使用的库。

解决方法是在Python 3.5中,使用PEP 484中记录的方式,标准化了函数注释用于类型提示的方法。为了注释一个字符串列表,您可以使用List[str],其中List是从typing模块导入的。如果您的函数接受任何类似列表的序列,您还可以使用Sequence[str],或者对于任何可迭代对象,可以使用Iterable[str]。

从Python 3.9开始,您可以使用list[str]作为类型注释,而无需导入任何内容。

0