Аннотации типа Python для последовательностей строк, но не для строк?

Есть ли подсказка типа 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: ...

Но существующая подпись выглядит раздутой ко мне и не распространяется на какие-либо пользовательские типы, совместимые с списком и кортежем. Есть ли лучший способ?

Ответы

Ответ 1

Возможно, я не совсем понял ваши вопросы, но для меня это похоже на поиск следующего ярлыка:

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

Тип wherease - это str и object переменная из необработанных данных, предоставляемая через list или tuple элементов. Если я не понял ваш вопрос, углубляющий ваш вопрос, более подробно, возможно, поможет? Или был приведенный выше ответ, чтобы вы пошли? Тогда немного раны обратной связи будут приятными; -)

Ответ 2

Я ничего не мог найти об исключении типа или отрицании типа, похоже, что он не поддерживается в текущей версии 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