微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 mypy

如何解决如何使用 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 举报,一经查实,本站将立刻删除。