Этот вопрос очень хорошо основан на мнении, однако я думаю, что может быть более веский аргумент в пользу мутаторов, аннотированных ожидаемым типом (т.е. def bar(self, value: int) -> None:
). Во-первых, аннотации были реализованы для помощи в статическом анализе, а не для обеспечения каких-либо реальных преимуществ во время выполнения (в настоящее время, насколько мне известно, они не делают этого. Из Обоснование PEP 484:
Из этих целей наиболее важной является статический анализ. Это включает поддержку автономных средств проверки типов, таких как mypy, а также предоставление стандартной нотации, которая может использоваться IDE для завершения кода и рефакторинга.
Если аннотации типов в значительной степени предназначены для использования в статическом анализе, линтинге и т. Д., Было бы логично, что вы захотите иметь возможность проверить, что вы передаете неправильный тип, а не потенциально обнаруживать во время выполнения, что вы не обработали параметр должным образом. с проверкой типа, например, с использованием isinstance
.
Это также означало бы, что мы можем делать больше с меньшими затратами, поскольку более конкретная аннотация int
избавит нас от необходимости добавлять эти средства защиты типов:
def bigger_fun(n: Any) -> None:
if isinstance(n, float):
# do something...
else
# dosomething else...
def smaller_fun(n: int) -> None:
# do something
Вы будете точно знать, какой тип вы получите и как с ним обращаться, вместо того, чтобы реализовывать несколько различных условных ветвей, чтобы сначала привести параметр к ожидаемому значению, прежде чем работать с ним. Это позволит вам сделать ваши мутаторы настолько тонкими, насколько это возможно, с минимальной внутренней логикой / обработкой.
Если вы передадите ему неправильный тип, ваша IDE или инструмент статического анализа по крайней мере предупредит вас, например, при передаче float
вместо smaller_fun
. С другой стороны, использование Any
может вызвать неожиданное поведение для некоторых типов, что приводит к ошибкам времени выполнения, которые может быть трудно отследить.
Теперь, более конкретно к вашему вопросу, тот же PEP касается использования аннотаций @property
в Значение аннотаций
Ожидается, что средства проверки типов попытаются вывести столько информации, сколько необходимо. Минимальное требование - обработка встроенных декораторов @property, @staticmethod и @classmethod.
Это означает, что вы можете ожидать, что аннотация @property
будет нормально работать, как и следовало ожидать. Без особого обращения.
Хотя python по сути является языком с динамической типизацией, такие методы, как мутатор, очень сильно привязаны к определенному значению (и, следовательно, типу) и должны действительно делать только одно, а не одно из множества. Таким образом, хотя это, вероятно, позволяет такому методу сравнения, как __gt__
, который, вероятно, будет выполнять разные операции для разных типов, принимать значение Any
, мутатор должен иметь как можно более узкую область действия.
Наконец, хотя подсказки типов не являются и, вероятно, никогда не должны быть обязательными, все самые популярные IDE Python, такие как Pycharm, автоматически поддерживают подсказки типов. Они часто выдают предупреждения, даже если другой программист может не аннотировать типы, но тип можно безопасно вывести. Это означает, что даже при использовании библиотеки с подсказками типов мутаторы с аннотацией int
все равно будут более информативными и полезными для конечного пользователя, чем аннотация Any
.
person
joshmeranda
schedule
12.03.2021
Any
всегда допустимо. НоAny
в основном означает не проверять тип. - person juanpa.arrivillaga   schedule 12.03.2021def foo(x: int): return x
, ну, входящее значение может быть любого типа, но я отмечаю, что оно должно бытьint
. - person juanpa.arrivillaga   schedule 12.03.2021