Как объявить гибрид процедуры / функции в MyPy

У меня есть функция, которая может возвращать значение (тогда это должно быть int) или вести себя как процедура (т. Е. Она вообще не вызывает return, а затем фактически возвращает None). Как вы уже догадались, это функция main() в этом хорошо известном шаблоне:

if __name__ == '__main__':
    import sys
    sys.exit(main(sys.argv))

Для этого подготовлена ​​функция sys.exit(), она принимает int и None одинаково.

Некоторые main() функции просто выполняют действия и завершаются без явного return, другие return явного int. Я хотел бы объявить это при постоянном вводе текста, чтобы изменение моего main() с «ничего не возвращать» на «вернуть код выхода» не означало, что мне нужно корректировать объявление набора.

Мои испытания:

def main(argv: List[str]) -> Optional[int]:
    print_something()

(Затем MyPy жалуется на отсутствие оператора return.)

def main(argv: List[str]) -> Union[int, None]:
    print_something()

(То же, что и выше.)

def main(argv: List[str]) -> Optional[int]:
    print_something()
    return

("ошибка: ожидаемое возвращаемое значение": ярость :)

def main(argv: List[str]) -> Optional[int]:
    print_something()
    return None

(Ой, давай. Но работает, да. Я не доволен бесполезным return None в итоге. Думаю, Optional уже дает понять, что ничего не может быть возвращено.)

def main(argv: List[str]) -> Any:
    print_something()

(Конечно, работает, но использование Any является слишком общим. Возврат, например, строка случайно не будет найдена средством проверки статического типа.)

Есть ли способ, о котором я еще не придумал, чтобы достичь того, чего хочу?


person Alfe    schedule 05.01.2018    source источник


Ответы (1)


(Ой, давай. Но работает, да. Я не доволен бесполезным return None в конце. Я думаю, что Optional уже дает понять, что ничего не может быть возвращено.)

Я бы сказал, что Optional дает понять, что он может возвращать необязательное значение. IE. int. Я считаю, что вам еще нужно поставить ожидаемое возвращаемое значение. В этом случае это будет None.

Хорошее обсуждение None как возвращаемого значения здесь

См. Также документы mypy относительно строгих необязательных типов и отсутствия проверки

person jk622    schedule 05.01.2018