如何正确地为字符串列表进行注解/类型提示
如何正确地为字符串列表进行注解/类型提示
我正在尝试弄清楚如何正确地对字符串列表进行注释或类型提示。例如,如果我有一个像这样的函数:\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
,错误就会消失,但这不会正确地反映出我的参数意图。
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进行注释。需要注意的是,这种新的语法只影响类型注释,而不影响其他上下文中的代码。
在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:"字段中放置多个电子邮件。