В модуле typing
такой функции нет и скорее всего не будет.
Проверка того, является ли объект экземпляром класса, что означает только то, что "этот объект был создан конструктором класса" - это простой вопрос проверки некоторых тегов.
Однако проверка того, является ли объект «экземпляром» типа, не обязательно разрешима:
assert isinstance(foo, Callable[[int], str]), 'Wrong type'
Хотя легко проверить типизированные аннотации foo
(при условии, что это не lambda
), проверка соответствия им, как правило, неразрешима по теореме Райса.
Даже с более простыми типами, такими как List[int]
, тест легко станет слишком неэффективным, чтобы его можно было использовать для чего-либо, кроме самых маленьких игрушечных примеров.
xs = set(range(10000))
xs.add("a")
xs.pop()
assert isinstance(xs, Set[int]), 'Wrong type'
Трюк, который позволяет программе проверки типов выполнять эту операцию относительно эффективно, заключается в том, чтобы быть консервативным: программа проверки типов пытается доказать, что foo
всегда возвращает int
. В случае сбоя он отвергает программу, даже если программа может быть валидной, т.е. эта функция, скорее всего, будет отклонена, хотя она совершенно безопасна:
def foo() -> int:
if "a".startswith("a"):
return 1
return "x"
person
Elazar
schedule
28.04.2017
mypy
людьми черезgitter
, и похоже, что аналогичная функция находится в разработке, я посмотрю, смогу ли я найти кого-нибудь из проекта, чтобы ответить здесь, и, возможно, обновить его по мере продвижения. - person Bertrand Caron   schedule 28.04.2017typing_inspect
— это не совсем то, что вы ищете; это больше касается проверки самих объектов типов. - person Elazar   schedule 28.04.2017