Mypy предназначена для обработки сигнатур функций как «источника правды».Если вы укажете, что какая-то функция возвращает Optional[str]
, тогда mypy будет считать, что так будет всегда.Он не будет пытаться увидеть, как какие-либо глобальные переменные могут или не могут изменить сигнатуру этой функции.
Самый простой способ обойти это - добавить проверку assert
или isinstance
:
maybe_string = minimal_example()
reveal_type(maybe_string) # Revealed type is Optional[str]
assert maybe_string is not None # Or use 'if isinstance(maybe_string, str)
reveal_type(maybe_string) # Revealed type is str
(Если вы не знаете, mypy будет в особом случае использовать функцию reveal_type(...)
: всякий раз, когда mypy встречает ее, mypy выводит тип любого выражения, которое вы предоставляете. Это полезно для отладки, но вы должныне забудьте удалить псевдо-функцию после того, как вы закончите, так как она не существует во время выполнения.)
В качестве альтернативы, вы можете изменить код, чтобы возвращаемое значение вашей функции было более нормализованным - оно всегда возвращаетстрока вместо того, чтобы иногда возвращать единицу.
Если RET_NONE
означает более или менее неизменный глобал (например, что-то вроде «включить режим отладки» или «предположим, что мы работаем в Windows»),Вы можете использовать это, чтобы воспользоваться флагами --always-true
и --always-false
mypy и предоставить два разных определения minimal_example
.Например:
RET_NONE = False
if RET_NONE:
def minimal_example() -> None:
return None
else:
def minimal_example() -> str:
return str
Затем вы вызываете mypy, используя mypy --always-true RET_NONE
или mypy --always-false RET_NONE
, чтобы соответствовать определению вашей переменной.Вы можете найти больше информации об этих типах здесь и, возможно, здесь .
Четвертая альтернатива, которую вы можете изучить, - это использование перегрузок функций: https://mypy.readthedocs.io/en/latest/more_types.html#function-overloading
Однако, idk, если это действительно работает в вашем случае: вы не можете определить перегрузки, когда отличается только тип возвращаемого значения: аргументарность или типы каждой перегрузки должны каким-то образом отличаться друг от друга.