1 как тип параметра в объявлении функции

Если вам нужно указать тип параметра в 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 есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Аннотации не имеют значения для компилятора и интерпретатора 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.

Вы упомянули PyCharm - я его использую. И никаких предупреждений для этой функции (2 и 3) нет.

Stanislav Chernischuk 02.06.2018 03:04

@StanislavChernischuk Я им не пользуюсь. Я знаю, что он утверждает, что имеет встроенную проверку статического типа, но больше я не знаю.

abarnert 02.06.2018 03:05

@StanislavChernischuk В результате быстрого поиска я нашел это, но, похоже, он больше касается использования PyCharm для добавления и управления подсказками типов, чем использования его для их проверки. Я больше не могу вам с этим помочь (но если вам нужна помощь в добавлении mypy в ваш emacs fly-check…).

abarnert 02.06.2018 03:07

в любом случае, это очень полезный справочник для меня. Я тоже не знал о mypy. Все это мне очень поможет!

Stanislav Chernischuk 02.06.2018 03:11

Другие вопросы по теме