Использование подсказки подсказки типа с использованием types.FunctionType vs typing.Callable? - PullRequest
1 голос
/ 26 апреля 2019

Каковы недостатки или преимущества использования types.FunctionType против typing.Callable в качестве аннотации подсказки типа?

Рассмотрим следующий код ...

import types
import typing

def functionA(func: types.FunctionType):
    rt = func()
    print(func.__name__)
    return rt

def functionB(func: typing.Callable):
    rt = func()
    print(func.__name__)
    return rt

Единственное отличие, которое я вижу, это Callable, это может быть любой вызываемый объект (функция, метод, класс и т. Д.), В то время как FunctionType ограничен только функциями.
Am Iс видом что-то?Есть ли преимущество в использовании FunctionType над Callable в определенных ситуациях?

1 Ответ

1 голос
/ 26 апреля 2019

Модуль 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, а не произвольным вызванным.

...