Подтвердить что ты не робот

Аннотации типа 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: ...

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

4b9b3361

Ответ 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