Cha*_*eon 8 python python-3.x python-typing
如何为所有这些可调用对象指定一种类型:
a(str)
b(str, str)
c(str, str, str)
d(str, str, str, str
Run Code Online (Sandbox Code Playgroud)
我发现我可以Callable[..., None]用一般方式指定,但如何详细指定所有参数都将是 str 而不使用丑陋的语法Union[Callable[[str], None], Callable[[str, str], None, __more_like_this__]。有其他方法可以做到吗?我可以通过使用打字来做到吗?
你想要的是 4 种不同类型的联合。
t1 = Union[
Callable[[str],Any],
Callable[[str,str],Any],
Callable[[str,str,str],Any],
Callable[[str,str,str,str],Any],
]
Run Code Online (Sandbox Code Playgroud)
将其与可以接受 1 到 4 个参数的函数类型进行对比:
t2 = Callable[[str,Optional[str],Optional[str],Optional[str]],Any]
Run Code Online (Sandbox Code Playgroud)
像这样的函数
def foo(x: str, y:str):
Run Code Online (Sandbox Code Playgroud)
不属于上面的第二种。如果我说我需要一个类型为 的函数t2,您不知道我可能会尝试传递多少个参数。我可以给你foo,但是你可能会尝试传递 3 个参数,或者只传递 1 个,然后得到一个TypeError.
如果你要求一个类型的函数t1,我可以给你foo。t1不保证in 中的所有值t1可以多于或少于 3 个参数;它只包含具有的值。
您可以使用回调协议来指定具有可变参数字符串参数的函数类型:
from typing_extensions import Protocol
class Callback(Protocol):
def __call__(self, *args: str) -> None: ...
Run Code Online (Sandbox Code Playgroud)
并像这样使用它:
def handler(cb: Callback) -> None:
cb('a', 'b', 'c')
def callback(*args: str) -> None:
pass
handler(callback)
Run Code Online (Sandbox Code Playgroud)
请注意,回调必须采用可变参数,例如。这行不通:
def callback(a: str, b: str) -> None:
pass
Run Code Online (Sandbox Code Playgroud)
协议在 Python 3.8 中添加到标准库类型模块中,因此如果您想在 Python 3.5-3.7 上使用它们,则需要从 PyPI安装类型扩展模块。
| 归档时间: |
|
| 查看次数: |
4029 次 |
| 最近记录: |