如何解决如何使用 mypy
我必须用不同大小的参数重载 python 函数。我可以做到,我可以对不正确的调用进行运行时检查,见下文。是否可以让 mypy 检查不正确的使用? 我正在使用 python-3.7.3 和 mypy-0.770。
from functools import singledispatch
class A:
def __init__(self) -> None:
self.dummy = 0
class B:
def __init__(self) -> None:
self.dummy = 1
@singledispatch
def base(arg,*args) -> None:
del arg,args # Not used
# It should not be called
print("unexpected call to dummy base")
@base.register
def xa(arg: A,val0: int,sval: str="") -> None:
del arg # Not used
if not isinstance(sval,str) :
print("bad call to a-variant")
return
print("called a-variant: val0={} sval='{}' ".format(val0,sval))
@base.register
def xb(arg: B,val1: int,sval: str ="") -> None:
del arg # Not used
print("called b-variant: val0={} val1={} sval='{}'".format(val0,val1,sval))
def test() -> None:
base(A(),10)
base(A(),11,"xxx")
base(B(),10,20)
base(B(),22,"yyy")
# Bad
base(A(),20)
解决方法
我能够通过使用typing.overload 来解决这个问题。
更新:解决重载函数不接受所有可能参数的mypy错误需要一些时间。
from typing import overload,Optional,Union
class A:
def __init__(self) -> None:
self.dummy = 0
class B:
def __init__(self) -> None:
self.dummy = 1
@overload
def base(arg: A,val0: int,val1: str = "") -> None:
...
@overload
def base(arg: B,val1: int,val2:str = "") -> None:
...
def base(arg: Union[A,B],val1: Union[str,int] = "",val2: Optional[str] = None) -> None:
if isinstance(arg,A):
print("got A")
return
if isinstance(arg,B):
print("got B")
return
print("unexpected")
def test() -> None:
base(A(),10,"xxx")
base(B(),20,"yyy")
# Bad
base(A(),"xxx",20)
base(B(),"ttt")
base(25)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。