我正在尝试理解如何使用可选类型提示。从PEP-484,我知道我可以使用可选的def测试(a: int = None)作为def测试(a:联盟[int, None])或def测试(a:可选[int])。
但是下面的例子呢?
def test(a : dict = None):
#print(a) ==> {'a': 1234}
#or
#print(a) ==> None
def test(a : list = None):
#print(a) ==> [1,2,3,4, 'a', 'b']
#or
#print(a) ==> None
如果Optional[type]似乎意味着与Union[type, None]相同的事情,为什么我应该使用Optional[]呢?
正如已经在一些注释中指出的那样,自Python 3.7以来,已经可以通过__future__导入使用新样式的类型注释:
from __future__ import annotations
def test(a: dict[str, int] | None) -> None:
...
至于自动回答这个问题和许多其他通用的最佳实践问题,我强烈建议使用pyupgrade以现代Python风格自动重新格式化您的类型注释和其余代码。对于单个文件,在添加__future__导入后,运行pyupgrade——py37-plus——keep-runtime-typing file.py。
如果您使用Git,那么pyupgrade可以设置为预提交钩子,以便您的代码始终保持现代化。这是我使用的块:
# Upgrade code style to the specified minimum supported Python version.
- repo: https://github.com/asottile/pyupgrade
rev: v3.3.1 # Adjust this to the latest version of pyupgrade
hooks:
- id: pyupgrade
# Adjust the following to the minimum supported Python version for your project.
args:
- --py37-plus
- --keep-runtime-typing
注意:如果你使用Pydantic、FastAPI或其他依赖于运行时类型的类似工具,——keep-runtime-typing参数是必需的。否则,可以安全地省略此参数。