字符串序列的Python类型注释,但不适用于字符串?

问题描述 投票:24回答:3

是否有Python类型提示匹配列表,元组和可能的其他顺序类型,但不匹配字符串?

问题是字符串同时是长度为1的字符串序列(例如单个字符),因此它们在技术上与Sequence[str]匹配,但是为期望字符串列表的函数提供字符串可能是100%情况下的错误。

有没有办法从类型注释中排除字符串,使其类似于不存在的And[Sequence[str], Not[str]]

至于目的,我想注释这个功能:

PathType = Union[str, os.PathLike]
def escape_cmdline(argv: Union[List[PathType], Tuple[PathType]]) -> str: ...

但是现有的签名看起来很臃肿,并没有涵盖列表和元组兼容的任何自定义类型。有没有更好的方法?

python python-3.x typing
3个回答
1
投票

我找不到关于类型排除或类型否定的任何内容,似乎在当前版本的Python 3中不支持它。因此,我想到的字符串的唯一显着特征是字符串是不可变的。也许它会有所帮助:

from typing import Union
from collections.abc import MutableSequence


MySequenceType = Union[MutableSequence, tuple, set]
def foo(a: MySequenceType):
    pass

foo(["09485", "kfjg", "kfjg"]) # passed
foo(("09485", "kfjg", "kfjg")) # passed
foo({"09485", "kfjg", "kfjg"}) # passed
foo("qwerty") # not passed

1
投票

我可能不完全理解您的问题,但对我来说,您似乎正在寻找以下快捷方式:

for object in data:
    if not isinstance(object, type):
        your code functions + list...
        .... etc.

wherease类型是strobject,是通过listtuple项目提供的原始数据的变量。如果我误解了你的问题,加深你的问题可能会有所帮助吗?或者上述答案是否足以让你前进?然后一点反馈伤口很好;-)


1
投票

显然,类型提示不可能实现这一点。根据Guido van Rossum的说法,PEP 484无法区分Sequence[str]Iterable[str]str

资料来源:https://github.com/python/mypy/issues/1965https://github.com/python/typing/issues/256

© www.soinside.com 2019 - 2024. All rights reserved.