带有排除类型的TypeVar的Python类型注释

带有排除类型的TypeVar的Python类型注释,python,mypy,python-typing,Python,Mypy,Python Typing,我正试图使用@重载来传达调用函数的不同方式,但是在类型注释中不可能通过简单的else语句在代码中轻松传达什么。如果没有“else”,MyPy(正确)会抱怨重载版本不匹配(例如,请参阅下面的代码段) 错误:重载函数签名1和2与不兼容的返回类型重叠 我是否正确理解这个问题没有好的解决方案 下面是一个简单的例子: ListOrTuple=TypeVar(“ListOrTuple”,List,Tuple) #不幸的是,目前键入不支持“其他任何内容” # https://github.com/python

我正试图使用
@重载
来传达调用函数的不同方式,但是在类型注释中不可能通过简单的
else
语句在代码中轻松传达什么。如果没有“else”,MyPy(正确)会抱怨重载版本不匹配(例如,请参阅下面的代码段)

错误:重载函数签名1和2与不兼容的返回类型重叠

我是否正确理解这个问题没有好的解决方案

下面是一个简单的例子:

ListOrTuple=TypeVar(“ListOrTuple”,List,Tuple)
#不幸的是,目前键入不支持“其他任何内容”
# https://github.com/python/typing/issues/599#issuecomment-586007066
AnythingElse=TypeVar(“AnythingElse”)
#我想要的是AnythingElse=TypeVar(“AnythingElse”,而不是[List,Tuple])
@超载
定义为列表(val:ListOrTuple)->ListOrTuple:
...
@超载
def as_列表(val:AnythingElse)->list[AnythingElse]:
...
def as_列表(val):
“”“按原样返回列表/元组,否则在列表中换行
>>>as_列表(“测试”)
[“测试”]
"""
如果isinstance(val,(list,tuple))else[val],则返回val

这是我所做的工作。这对我来说已经足够好了,但我一点也不喜欢

# attempt to list all the "other" possible types
AnythingElse = TypeVar("AnythingElse", Set, Mapping, type, int, str, None, Callable, Set, Deque, ByteString)
ListOrTuple = TypeVar("ListOrTuple", List, Tuple, Sequence)


@overload
def as_list(val: ListOrTuple) -> ListOrTuple:
    ...

@overload
def as_list(val: AnythingElse) -> List[AnythingElse]:
    ...

def as_list(val):
    """Return list/tuple as is, otherwise wrap in a list

    >>> as_list("test")
    ['test']
    """
    return val if isinstance(val, (list, tuple)) else [val]