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

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

4

4 回答 4

107

从你的例子:

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

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

从 3.5 版开始,Python 通过typingmodule支持类型注解。在您的情况下,推荐的注释方式是使用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):
    ...
于 2016-10-03T07:59:01.377 回答
22

只是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()或更 apt tc.anything

于 2016-07-21T23:47:30.370 回答
11

Python 3.10(在撰写本文时处于测试阶段)将支持您最初想要的符号:str | None.

资源

于 2021-06-08T03:46:40.697 回答
10

我知道感谢@mbdevpl,我知道这个问题被认为是回答了,但是,我想补充一下,这type(None)就是你如何获得 None 类型的实际值,这可能很有用,例如if statement check

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

并且因为python3.5,您还可以使用 doUnion的一堆类型与 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]]
于 2020-07-29T13:56:23.387 回答