Я бы хотел иметь возможность повторно использовать typing
намного больше, а именно для проверки типов, и желательно таким образом, чтобы это соответствовало обычному способу проверки, имеет ли что-то тип ...
(Мой) идеальный вариант - иметь возможность делать что-то вроде:
from typing import Union, Iterable, Any, Mapping
KeysType = checkable(Union[Iterable[str], Mapping[str, Any]])
assert isinstance(['foo', 'bar'], KeysType)
assert not isinstance([3, 'foo', 'bar'], KeysType)
assert isinstance({'foo': 1, 'bar': 2}, KeysType)
assert isinstance({0: 0, 'foo': 1, 'bar': 2}, KeysType)
assert not isinstance(5, KeysType)
Конечно, что-то не так, потому что я использую isinstance
для обозначения has_interface_of
или has_compatible_stucture
. Когда wi sh беспокоит меня, я говорю себе следующее:
from collections.abc import Mapping
isinstance(dict(), Mapping)
И все же dict
не является экземпляром Mapping
.
Тем не менее, даже пользовательская функция is_sorta_like_this_type
вместо функции isinstance
подойдет, если подключение к поведению isinstance
- это слишком пугающая аберрация.
Подобные вопросы имеют было задано в stackoverflow, но ни один из предложенных ответов меня не вполне удовлетворит - хотя это один , хоть и хакерский, но самый близкий, что у меня есть.