Я использую библиотеку 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
?
Точно, моя актуальная стратегия украшена @st.composite
Чтобы прояснить раздел документации, который вы видите: вариант использования — это последующие подсказки, которые вы предоставите конечным пользователям поддерживаемой вами библиотеки. Подразумевается, что вы где-то уже сгенерировали стратегию внутри себя, и вам нужна подсказка типа, чтобы сообщить пользователю, что вы в конечном итоге даете ему.
Функции, украшенные @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]
То же самое и с другими декораторами: конечный тип функции определяется ее исходными подсказками типа и всеми ее @decorator
s. В случае 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)
int_strategy()
украшен@composite
? Пожалуйста, отредактируйте, чтобы уточнить, как эта стратегия реализуется и используется.