Eli*_*lev 12 python type-hinting pycharm python-3.x nonetype
我想对没有参数的函数使用类型提示
from typing import Callable
def no_parameters_returns_int() -> int:
return 7
def get_int_returns_int(a: int) -> int:
return a
def call_function(next_method: Callable[[], int]):
print(next_method())
call_function(no_parameters_returns_int) # no indication of error from IDE expected
call_function(get_int_returns_int) # expected an indication of error from IDE
Run Code Online (Sandbox Code Playgroud)
我希望 PyCharm 在我传递带有参数的函数时标记该行。也尝试Callabale[[None], int]过 和Callabale[[...], int]。然而,第一个暗示传递的函数接收None类型参数,第二个暗示传递的函数接收至少一个参数。
是否可以暗示传递的函数不接收任何参数?
是否可以暗示传递的函数不接收任何参数?
不带参数键入提示 a 的正确方法Callable如下:
Callable[[t1, t2, ..., tn], tr]。t1具有位置参数类型等以及返回类型 的函数tr。参数列表可能为空 n==0。
一个明确的例子在:
Run Code Online (Sandbox Code Playgroud)- Callable[[], int] is a subtype of Callable[[], float]. - Callable[[], Manager] is a subtype of Callable[[], Employee].
还有:
Run Code Online (Sandbox Code Playgroud)from typing import Callable def feeder(get_next_item: Callable[[], str]) -> None: # Body
内置名称应与None类型None区分开(第一个用于访问第二个):
没有任何
- 该类型具有单一值。有一个具有该值的对象。通过内置 name 访问
None该对象。
用作类型提示的内置名称的语法和含义None是一种特殊情况:
当在类型提示中使用时,该表达式
None被视为等效于type(None)。
考虑到上述情况,以下两种方法(尝试编写Callable不带参数的函数的类型提示)是错误的,这并不奇怪:
Callable[[None], tr]
Callable[[type(None)], tr]
Run Code Online (Sandbox Code Playgroud)
类型提示中的省略号Callable仅表示:
请注意,省略号周围没有方括号。在这种情况下,回调的参数完全不受约束(并且关键字参数是可接受的)。
由于它是“不受约束的”,因此以下内容不太可能导致静态类型检查器因参数而发出任何警告:
Callable[..., tr]
Run Code Online (Sandbox Code Playgroud)
Callable值得注意的是,和(省略号)之间Any的关系。...
同样,注释中的裸 Callable 相当于 Callable[..., Any]
最后,如果您通过MyPy运行代码,实际上会发出预期的警告:
main.py:13: 错误:“call_function”的参数 1 具有不兼容的类型“Callable[[int], int]”;预期“Callable[[], int]” 在 1 个文件中发现 1 个错误(已检查 1 个源文件)
我在PyCharm 2020.2 Pro中检查了您的示例,IDE 没有发出上述警告。请注意,PyCharm 使用其自己的 PEP 484 实现,并且已知其静态类型检查器存在错误。
我认为你发现了一个错误...
最后注意:运行type(None)给出NoneType. 在Python 3中,虽然NoneType在 Python 2 中它是可导入的,但并不公开供导入。
编辑:出于某种原因,Python 3.10重新引入types.NoneType了.
| 归档时间: |
|
| 查看次数: |
8797 次 |
| 最近记录: |