Python 3.10+:可选[类型] 或类型 |没有
Posted
技术标签:
【中文标题】Python 3.10+:可选[类型] 或类型 |没有【英文标题】:Python 3.10+: Optional[Type] or Type | None 【发布时间】:2021-11-25 03:28:47 【问题描述】:现在 Python 3.10 已经发布了,当指示参数或返回值可能是可选的时,是否有任何偏好,即可以是None
。那么什么是首选:
选项 1:
def f(parameter: Optional[int]) -> Optional[str]:
选项 2:
def f(parameter: int | None) -> str | None:
另外,Type | None
和 None | Type
之间有什么偏好吗?
【问题讨论】:
3.10 文档不会弃用 Union 或 Optional 以支持新语法,所以这取决于您。 【参考方案1】:PEP 604 在规范部分涵盖了这些主题。
现有的
typing.Union
和|
语法应该是等价的。int | str == typing.Union[int, str]
Union 中项目的顺序对于相等性无关紧要。
(int | str) == (str | int) (int | str | float) == typing.Union[str, float, int]
可选值应该等同于新的联合语法
None | t == typing.Optional[t]
由于@jonrsharpe comments、Union
和Optional
未被弃用,因此Union
和|
语法是可以接受的。
Python 核心开发人员Łukasz Langa 在与 Python 3.10 版本相关的 YouTube 直播中回复说,对于 Python 3.10+,Type | None
优于 Optional[Type]
。
【讨论】:
感谢您的回答。我通过 YouTube 直播提出了这个问题,Lukas Langa 回复说Type | None
现在是 Python 3.10 的首选方式。如果您不介意,我可以在屏幕截图中将此添加到您的答案中。
@lmiguelvargasf - 没问题
@Imiguelvargasf 他会说——他写了 PEP ;) 这只是个人喜好 imo 的问题,尽管我个人想不出我会发现旧语法更清晰的情况或更具可读性。另一方面,它更向后兼容!
@AlexWaygood - 我没有看到 Lukasz Langa 的名字。你确定是他写的?
@jakub 我的错!看起来我把 PEP 585 和 PEP 604 搞混了。感谢您的指正。输入 PEP 太多、时间太少等【参考方案2】:
我个人会选择 选项 2 继续前进。
另外,只是想添加它以提高意识,但 Python 3.7+ 可以使用 __future__
导入来支持这种语法,如下所示。这种类型的检查是一样的;我实际上是从我目前正在使用的 Pycharm 的最新发行说明中得到提示的。
from __future__ import annotations
def f(parameter: int | None) -> str | None:
...
【讨论】:
【参考方案3】:非权威,但我希望 Optional
何时
None
)
None
对于调用者来说是不寻常的
虽然我希望在何时使用一些 Union
或 |
None
None
也是一个有效值
在How do I add default parameters to functions when using type hinting?查看相关建议
【讨论】:
以上是关于Python 3.10+:可选[类型] 或类型 |没有的主要内容,如果未能解决你的问题,请参考以下文章