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

2024-09-29 19:30:40 发布

您现在位置:Python中文网/ 问答频道 /正文

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

error: Overloaded function signatures 1 and 2 overlap with incompatible return types

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

下面是一个简单的例子:

ListOrTuple = TypeVar("ListOrTuple", List, Tuple)
# unfortunately, typing doesn't support "anything else" at the moment
# https://github.com/python/typing/issues/599#issuecomment-586007066
AnythingElse = TypeVar("AnythingElse")
# what I would like to have is something like AnythingElse= TypeVar("AnythingElse", Not[List,Tuple])

@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]

Tags: typingreturnisdefasvalelselist
1条回答
网友
1楼 · 发布于 2024-09-29 19:30:40

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

# 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]

相关问题 更多 >

    热门问题