繁体   English   中英

无的 Python 3 类型提示?

[英]Python 3 type hinting for None?

def foo(
        hello: str='world', bar: str=None,
        another_string_or_None: str|????=None):
    pass

我正在尝试在 Python 中的函数中设置类型提示,您可以使用以下内容添加多个类型提示something: str|bool='default value' ,但是, None的类型提示是什么? :/

从你的例子:

def foo(
        hello: str='world', bar: str=None,
        another_string_or_None: str|????=None):
    ...

我注意到您的用例是“某事或无”。

从 3.5 版本开始,Python 通过typing模块支持类型注释。 在您的情况下,推荐的注释方式是使用typing.Optional[something] hint 这具有您正在寻找的确切含义。

因此another_string_or_None的提示是:

import typing

def foo(
        hello: str='world', bar: str=None,
        another_string_or_None: typing.Optional[str]=None):
    ...

只是None

>>> def nothing(nun: None) -> None:
...     return nun
... 
>>> nothing(None)
>>> 

或者至少,它可以

由于这些注释对 Python 来说除了语法正确/没有任何意义,这在某种程度上取决于工具。

例如,如果您使用typecheck-decorator ,那么您需要使用type(None)

>>> import typecheck as tc
>>>
>>> @tc.typecheck
>>> def nothing(nun: type(None)) -> type(None):
...     return nun
... 
>>> nothing(None)
>>> nothing(0)
typecheck.framework.InputParameterError: nothing() has got an incompatible value for nun: 0
>>> nothing(False)
typecheck.framework.InputParameterError: nothing() has got an incompatible value for nun: False

类型检查还允许您使用tc.any() (OR)、 tc.all() (AND) 等更清楚地“添加多个类型提示”,除此之外。

注意tc.none()是一个类似于 NAND 的谓词; 不是您要查找的内容 - 没有参数,它将接受任何类型,相当于tc.all()或更贴切的tc.anything

Python 3.10 将支持您最初想要的符号: str | None str | None

资源

由于@mbdevpl,我知道这个问题被认为已得到回答,但是,我想补充一点, type(None)是你如何获得实际的 None 类型,这在if statement check中很有用,例如:

if isinstance(x_var, type(None)):
    pass

并且由于python3.5 ,您还可以使用 do Union的一堆类型与 None 如下所示:

x_var: typing.Union[str, None]
y_var: typing.Union[Dict, List, None]

这相当于:

x_var: typing.Optional[str]
y_var: typing.Optional[typing.Union[Dict, List]]

根据PEP-0484 :“当在类型提示中使用时,表达式None被认为等同于type(None) 。”

我在使用@functools.singledispatch的类型提示签名时遇到了它,并且用None注释参数确实适用于函数调度装饰器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM