如何解决类型提示可调用,无参数
我想对没有参数的函数使用类型提示
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
我希望PyCharm在传递确实带有参数的函数时标记行。
还尝试了Callabale[[None],int]
和Callabale[[...],int]
。但是,第一个提示所传递的函数接收一个None
类型的参数,第二个提示所传递的函数接收至少一个参数。
是否可以暗示所传递的函数未接收任何参数?
解决方法
是否可以暗示所传递的函数未接收任何参数?
在没有参数的情况下提示类型Callable
的正确提示方式是
"Fundamental building blocks",PEP 483
Callable[[t1,t2,...,tn],tr]
。具有位置自变量类型t1
等,并返回类型tr
的函数。 参数列表可能为空n == 0 。
在以下示例中给出了一个明确的示例:
"Covariance and Contravariance",PEP 483
- Callable[[],int] is a subtype of Callable[[],float]. - Callable[[],Manager] is a subtype of Callable[[],Employee].
还有:
from typing import Callable def feeder(get_next_item: Callable[[],str]) -> None: # Body
内置名称None
应该与类型无 区分(第一个用于访问第二个):
3.2. The standard type hierarchy,Data Model
没有
- 此类型具有单个值。 单个对象具有该值。通过内置名称
None
访问此对象。
用作类型提示的内置名称None
的语法和含义是一种特殊情况:
在类型提示中使用时,表达式
None
被认为等同于type(None)
。
考虑到上述情况,以下两种方式(尝试编写不带参数的函数的Callable
类型提示)是错误的,这不足为奇:
Callable[[None],tr]
Callable[[type(None)],tr]
Callable
类型提示中的省略号仅表示:
请注意,省略号周围没有方括号。 在这种情况下,回调的参数是完全不受约束的(并且可以接受关键字参数)。
由于它是“不受约束的” ,因此以下情况不太可能导致静态类型检查器由于参数而发出任何警告:
Callable[...,tr]
值得注意的是,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 uses its own implementation of PEP 484及其静态类型检查器has been know to have bugs。
我认为您发现了一个错误...
-
最终说明:运行
type(None)
会得到NoneType
。尽管Python 3NoneType
中的in Python 2 it was importable中没有公开导入。 -
编辑:由于某些原因,Python 3.10是reintroducing
types.NoneType
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。