我有一个函数has接受两个参数,例如:
def f(first_arg: int, unused_arg) -> int:
first_arg += 1
return first_arg
我想输入我的函数,unused_arg 的类型应该是什么?从这个问题我猜可以使用
None
。
对于上下文,我使用
lax.scan
中的 jax
,它需要一个带有两个参数的函数,即使第二个参数未使用也是如此。
可以使用
Any
吗?
from typing import Any
def f(first_arg: int, unused_arg: Any) -> int:
...
文档 (https://jax.readthedocs.io/en/latest/_autosummary/jax.lax.scan.html) 给出
f
的类型为:
Callable[[~Carry, ~X], Tuple[~Carry, ~Y]]
所以如果我没有更具体的类型,我可能会用名为
TypeVar
的 X
来做:
from typing import TypeVar
X = TypeVar("X")
def f(first_arg: int, _second_arg: X) -> int:
...
使用
Any
可能会出现问题,因为它掩盖了类型检查——对于您从未使用过的变量来说并不重要,但是如果您的函数实现发生了变化,您可能不会意识到以前未使用的 arg 没有被使用类型检查,而如果您使用 TypeVar
,则如果对该变量做出任何未得到 bound
支持的假设,则会出现错误。我什至尝试避免导入Any
,只是为了确保它不会在我不注意的情况下爬到任何地方。
请注意,根据文档,您的
f
似乎预计会返回两个项目的元组;我不确定这对您的用例是否重要。
指示未使用参数的标准方法(至少由我使用的 linter 强制执行)是在其前面添加下划线,所以我会这样做,而不是命名它
unused_arg
)。
你应该使用 Never,来自文档“这可以用来定义一个永远不应该被调用的函数,或者一个永远不会返回的函数:”。
https://docs.python.org/3/library/typing.html#typing.Never
from typing import Never
def never_call_me(arg: Never) -> None:
pass