Если вам нужно указать тип параметра в Python, в моем примере - array, вам нужно написать что-то вроде этого:
def my_function(param: list):
pass
В Swift вы указываете тип параметра следующим образом:
func myFunction(param: [Any]) {
//
}
Однажды я сделал ошибку в стиле Swift и написал:
def my_function_2(param: []):
pass
Теперь я это заметил и попробовал что-то более странное:
def my_function_3(param: 1):
pass
Все эти функции действительны и могут быть вызваны в Python 3.6. Функция с ожидаемым типом параметра один ... Почему это происходит, почему я не вижу никаких предупреждений и какую переменную мне пришлось бы передать функциям 2 и 3 для удовлетворения ошибочно запрошенного мной типа параметра?






Аннотации не имеют значения для компилятора и интерпретатора Python. 1 Пока то, что вы вводите, является синтаксически допустимым выражением, Python оценит его, сохранит его значение как часть аннотаций функции и оставит его там, чтобы вы могли делать с ним все, что захотите. (обычно ничего).
Фактически, вы можете видеть, что это сохраняется без проблем:
>>> print(my_function_3.__annotations__)
{'param': 1}
Основная идея аннотаций заключается в использовании средства проверки статического типа, как объяснено в PEP 484 (и сопровождающих PEP 483 и PEP 482 для фона).
Статическая проверка типов не является обязательной в Python и обычно выполняется с помощью специального инструмента, такого как mypy, или инструментов, интегрированных в IDE, таких как PyCharm.
Если вы запустите такую проверку для своего кода, он пожалуется. Например:
$ mypy testscript.py
testscript.py:1: error: invalid type comment or annotation
Эта ошибка означает, что он не может определить, какой тип должен быть 1.
Последняя вещь:
what kind of variable I would have to pass to functions 2 and 3 to satisfy parameter type I erroneously requested
Нет такого типа, который бы это удовлетворил. Правила типа времени выполнения Python более гибкие, чем его (необязательные) правила статического типа, но они не являются гибкими что.
1. However, they do have a meaning to at least one thing in the stdlib, the dataclass decorator.
2. Mypy continues on from here, but with no more errors, even if you abuse the parameter in the body or call the function improperly. As far as I can tell, it skips checking the body, and treats the function as if it took any parameters and returned an Any. Which is pretty reasonable—that way you just get this one error instead of hundreds of useless ones that probably wouldn't mean anything.
3. You can't even test for it—isinstance(obj, 1) will raise an exception because 1 is not an instance of type. But if you could, it could only return true if obj was created by calling 1 (or a subclass of 1, of which there are none) as a metaclass, which is impossible, or if obj.__class__ were set to 1 (or a subclass), which is impossible, or if int had an instance or subclass hook which accepted obj, which it doesn't. But—at least in CPython and PyPy—it won't even get that far. Of course you could always go below Python, below the C API, and directly modify the ob_type field of the struct underneath obj to point at the 1 object, but if you do that, anything you try to do with obj will just segfault.
@StanislavChernischuk Я им не пользуюсь. Я знаю, что он утверждает, что имеет встроенную проверку статического типа, но больше я не знаю.
@StanislavChernischuk В результате быстрого поиска я нашел это, но, похоже, он больше касается использования PyCharm для добавления и управления подсказками типов, чем использования его для их проверки. Я больше не могу вам с этим помочь (но если вам нужна помощь в добавлении mypy в ваш emacs fly-check…).
в любом случае, это очень полезный справочник для меня. Я тоже не знал о mypy. Все это мне очень поможет!
Вы упомянули PyCharm - я его использую. И никаких предупреждений для этой функции (2 и 3) нет.