1 как тип параметра в объявлении функции - PullRequest
0 голосов
/ 02 июня 2018

Если вам нужно указать тип параметра в Python, массив в моем примере, вам нужно написать что-то вроде этого:

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.Функция с ожидаемым типом параметра one ... Почему это происходит, почему я не вижу никаких предупреждений и какую переменную мне нужно передать функциям 2 и 3, чтобы удовлетворить тип параметра, который я ошибочно запросил?

1 Ответ

0 голосов
/ 02 июня 2018

Аннотации не имеют смысла для компилятора и интерпретатора 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 должен быть. 2


Последнийвещь:

какую переменную мне нужно было бы передать функциям 2 и 3 для удовлетворения типа параметра, который я ошибочно запросил

Нет типа, который бы удовлетворял этому.Правила типов времени выполнения Python более гибкие, чем его (необязательные) правила статического типа, но они не , а гибкие. 3


1,Однако они do имеют значение по крайней мере для одной вещи в stdlib: dataclass decorator .

2.С этого момента Mypy продолжается, но без ошибок, даже если вы неправильно используете параметр в теле или неправильно вызываете функцию.Насколько я могу судить, он пропускает проверку тела и обрабатывает функцию так, как будто она взяла какие-либо параметры и вернула Any.И это вполне разумно - таким образом вы получите только одну ошибку вместо сотен бесполезных, которые, вероятно, ничего не будут значить.

3.Вы даже не можете проверить это - isinstance(obj, 1) вызовет исключение , потому что 1 не является экземпляром type.Но если бы вы могли, он мог бы вернуть true, только если obj был создан путем вызова 1 (или подкласса 1, которого нет ни одного) в качестве метакласса, что невозможно, или если obj.__class__ былиустановить 1 (или подкласс), что невозможно, или если int имел экземпляр или подкласс подкласса, который принял obj, а это не так.Но - по крайней мере, в CPython и PyPy - это далеко не уйдет.Конечно, вы всегда можете перейти ниже Python, ниже C API и напрямую изменить поле ob_type структуры под obj, чтобы оно указывало на объект 1, но если вы сделаете это, то все, что вы попытаетесь сделать сobj будет просто segfault.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...