Модуль types
предшествует аннотациям PEP 484 и был создан в основном для облегчения самоанализа объектов во время выполнения.Например, чтобы определить, является ли какое-либо значение функцией, вы можете запустить isinstance(my_var, types.FunctionType)
.
. Модуль typing
содержит подсказки типов, которые специально предназначены для помощи инструментам статического анализа, таким как mypy.Например, предположим, что вы хотите указать, что параметр должен быть функцией, которая принимает два целых числа и возвращает str
.Вы можете сделать это так:
def handle(f: Callable[[int, int], str]) -> None: ...
Нет способа использовать FunctionType
подобным образом: он просто не предназначен для этой цели.
Эта сигнатура функции такжеболее гибкий: он также может принимать такие вещи, как объекты с __call__
, так как такие объекты действительно могут вызываться.
Содержимое модуля typing
иногда может также использоваться для проверок во время выполнения способом, аналогичнымсодержимое types
для удобства: например, выполнение isinstance(f, Callable)
работает.Однако эта функция намеренно ограничена: выполнение isinstance(f, Callable[[int, int], str])
намеренно запрещено.Попытка выполнить эту проверку вызовет исключение во время выполнения.
Тем не менее, я не думаю, что это хороший стиль для выполнения проверок во время выполнения, используя что-либо из typing
: модуль typing
подразумевается первым ипрежде всего для статического анализа.
Я бы не использовал ничего из модуля types
в подсказках типов по аналогичным причинам.Единственное исключение - если ваша функция написана таким образом, что очень важно, чтобы значение, которое вам нужно получить, было определенно экземпляром FunctionType
, а не произвольным вызванным.