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