Python 3类型提示为None?

fj1*_*23x 19 python type-hinting python-3.x nonetype

def foo(
        hello: str='world', bar: str=None,
        another_string_or_None: str|????=None):
    pass
Run Code Online (Sandbox Code Playgroud)

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

Odd*_*ing 74

Python 3.10 将支持您原来所需的符号:str | None.

来源

  • @Eliot:没有任何细节,我们无法判断它何时对我们不起作用,或者这是否是您的错误。 (2认同)

mbd*_*vpl 27

从你的例子:

def foo(
        hello: str='world', bar: str=None,
        another_string_or_None: str|????=None):
    ...
Run Code Online (Sandbox Code Playgroud)

我注意到你的用例是"某事或无".

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

因此提示another_string_or_None将是:

import typing

def foo(
        hello: str='world', bar: str=None,
        another_string_or_None: typing.Optional[str]=None):
    ...
Run Code Online (Sandbox Code Playgroud)

  • @solstice333是的,作为我答案的旁注:typing.Union[None, ABC] 的工作方式与typing.Optional[ABC] 相同。如果你有typing.Optional[typing.Union[int, str]],你可以将其更改为typing.Union[None, int, str]。 (3认同)
  • 从 Python 3.10 开始,您现在可以编写 `str | None`代替`typing.Optional[str]` (3认同)
  • 这就是我正在寻找的可选类型语义。或者,要执行变体类型语义,[typing.Union](https://docs.python.org/3/library/typing.html#typing.Union) 存在,或者如果您关心多个签名到返回类型的映射,[@typing.overload](https://docs.python.org/3/library/typing.html#typing.overload)也存在 (2认同)

OJF*_*ord 6

只是None

>>> def nothing(nun: None) -> None:
...     return nun
... 
>>> nothing(None)
>>> 
Run Code Online (Sandbox Code Playgroud)

或至少可以如此。

由于这些注释对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
Run Code Online (Sandbox Code Playgroud)

Typecheck还使您可以更清楚地使用tc.any()(OR),tc.all()(AND)和“ AND ”添加更多的类型提示。

当心这tc.none()是一个类似于NAND的谓词;而不是您要查找的内容-不带任何参数,它将接受等于或更apt的任何类型。tc.all()tc.anything


Hoc*_*tif 6

由于@mbdevpl,我知道这个问题被认为得到了回答,但是,我想补充一点,这type(None)就是您获得 None 类型实际值的方式,例如,这可能很有用if statement check

if isinstance(x_var, type(None)):
    pass
Run Code Online (Sandbox Code Playgroud)

并且因为python3.5,您还可以使用Union无的一堆类型,如下所示:

x_var: typing.Union[str, None]
y_var: typing.Union[Dict, List, None]
Run Code Online (Sandbox Code Playgroud)

这相当于:

x_var: typing.Optional[str]
y_var: typing.Optional[typing.Union[Dict, List]]
Run Code Online (Sandbox Code Playgroud)

  • 我不认为 `typing.Union[str, None]` 在所有情况下都与 `typing.Optional[str]` 完全等效。考虑这样一种情况,您有一个“TypedDict”,其中一个属性必须是“str”或“None”,但不能省略:``class MyClass(TypedDict): required_field: Union[str, None] `` ` (2认同)
  • @斯蒂夫拉没有。这是完全等价的。`Optional[X]` **并不意味着**“可以省略”。意思是“无”或“X” (2认同)

oyd*_*d11 6

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

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