Введите, намекая на составную стратегию гипотезы

Я использую библиотеку hypothesis и хотел бы аннотировать свой код подсказками типов. В документации hypothesis.strategies.SearchStrategy упоминается как тип для всех стратегий поиска.

Возьмем этот пример:

@composite
def int_strategy(draw: DrawFn) -> hypothesis.strategies.SearchStrategy[int]:
    ... # some computation here resulting in ``x`` being an ``int``

    return x

Запуск mypy (и это правильно) приведет к ошибке следующего содержания: error: Returning Any from function declared to return "SearchStrategy[Any]" [no-any-return]

Я имею в виду, что на самом деле я возвращаю int, а не SearchStrategy.

Как мне печатать аннотации к своим стратегиям hypothesis?

int_strategy() украшен @composite? Пожалуйста, отредактируйте, чтобы уточнить, как эта стратегия реализуется и используется.

InSync 07.06.2024 16:15

Точно, моя актуальная стратегия украшена @st.composite

Andi 08.06.2024 11:37

Чтобы прояснить раздел документации, который вы видите: вариант использования — это последующие подсказки, которые вы предоставите конечным пользователям поддерживаемой вами библиотеки. Подразумевается, что вы где-то уже сгенерировали стратегию внутри себя, и вам нужна подсказка типа, чтобы сообщить пользователю, что вы в конечном итоге даете ему.

CrazyChucky 08.06.2024 16:21
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
3
100
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Функции, украшенные @composite, должны иметь типизированные подсказки, как обычно:

@composite
def int_strategy(draw: DrawFn) -> int:
    ...

@composite затем автоматически преобразует это во что-то вроде:

# As if it doesn't have the `draw` parameter and that it returns a `SearchStrategy`
def int_strategy() -> SearchStrategy[int]:
    ...

Не верите мне? Спросите Mypy:

# At call site
reveal_type(int_strategy)    # () -> SearchStrategy[int]
reveal_type(int_strategy())  # SearchStrategy[int]

То же самое и с другими декораторами: конечный тип функции определяется ее исходными подсказками типа и всеми ее @decorators. В случае composite() это определяется следующим образом (по крайней мере, во время проверки типа):

# Takes a function whose first argument is of type `DrawFn`
# and returns a function without that argument,
# returning a `SearchStrategy` that will output
# values of the same type as the original's return type.
def composite(
    f: Callable[Concatenate[DrawFn, P], Ex]
) -> Callable[P, SearchStrategy[Ex]]:
    ...

На самом деле, использование SearchStrategy[] в качестве возвращаемого типа — настолько распространенная ошибка, что сопровождающие сделали это, чтобы вы получили предупреждение во время выполнения:

@composite
def int_strategy() -> SearchStrategy[int]:
    ...
tests/test_foo.py:6
  /project/tests/test_foo.py:6: HypothesisWarning: Return-type annotation is `st.SearchStrategy[int]`, but the decorated function should return a value (not a strategy)

Другие вопросы по теме