Python的新类型提示功能允许我们输入函数返回的提示None...
def some_func() -> None:
pass
Run Code Online (Sandbox Code Playgroud)
...或者保留未指定的返回类型,PEP规定应该使静态分析器假定任何返回类型都是可能的:
任何没有注释的函数都应该被视为具有最普遍的类型
但是,我应该如何键入一个函数永远不会返回的提示?例如,键入提示这两个函数的返回值的正确方法是什么?
def loop_forever():
while True:
print('This function never returns because it loops forever')
def always_explode():
raise Exception('This function never returns because it always raises')
Run Code Online (Sandbox Code Playgroud)
-> None在这些情况下,指定或保留未指定的返回类型似乎都不正确.
我来自打字稿背景。我正在将静态类型检查引入到我正在研究的python项目中(使用mypy)。
在Typescript中,从带有注释以返回其他内容(例如字符串)的函数中返回null是有效的:
function test(flag: boolean): string {
if(flag) {
return 'success';
} else {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
对函数进行注释以使其具有多种潜在的返回类型(例如字符串或布尔值)也是有效的:
function test(flag: boolean): string | boolean {
if(flag) {
return 'success';
} else {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,在使用mypy的python中,不允许从注释为return的函数返回None str。
def test(flag: bool) -> str:
if flag:
return 'success'
else:
return None
# [mypy] error:Incompatible return value type (got "None", expected "str")
Run Code Online (Sandbox Code Playgroud)
此外,我看不到注释多种返回类型的方法,即str | None。
我应该如何使用mypy处理类似的事情?从错误状态返回None的函数遍布我的代码库。
使用python 3,可以选择使用typehints.
我的问题是,如果一个函数返回None,应该添加一个,还是留空.
即
def hint(p:str) -> None:
pass
def no_hint(p:str):
pass
Run Code Online (Sandbox Code Playgroud)
哪个PEP解决了这个问题?
这三个函数的返回类型提示有什么区别吗?
def my_func1():
print("Hello World")
return None
def my_func2():
print("Hello World")
return
def my_func3():
print("Hello World")
Run Code Online (Sandbox Code Playgroud)
它们是否都应该有-> None返回类型提示,因为这就是它们实际上显式或隐式返回的内容?或者应该my_func2或my_func3实际上没有返回类型提示?
问这个问题的动机是这个问题,这个很好的答案,以及我正在学习Type Hints的事实。
当在 Python 中编写不返回值的类型化函数(如其他语言中的“void”)时,最好和/或按惯例将其标记如下吗?
def say_hello(name: str) -> None
print(f"Hello, {name}.")
Run Code Online (Sandbox Code Playgroud)
或者,应该省略-> None?
def say_hello(name: str)
Run Code Online (Sandbox Code Playgroud)
我想我要问的是,-> None省略是否会导致返回类型未指定,或者无论如何都被认为是NoneType这样,因此没有必要?