Эта статья является специальной статьей месяца Nuggets Python, просьба указать источник для перепечатки
В реках и озерах ходит поговорка: "Динамическая типизация пока крута, крематорий рефакторинга кода" широко распространена. Эта фраза обычно исходит из уст сторонников статического языка. Звучит немного сенсационно, но это не так. серьезный как воображаемый.Питон в масштабных проектах.Приложений слишком много,и Инстаграм лучший пример.
Будучи динамическим языком, Python не требует указания типов данных при определении переменных, возвращаемых значений функций и параметров методов, что в какой-то степени делает код предельно лаконичным и гибким, помимо эффективности работы программы, но динамические языки также имеют недостатки, такие как:
1. Смарт-подсказки IDE довольно безвкусны, т. к. нельзя судить о типе переменных, поэтому IDE не знает, какие у переменных атрибуты и методы.Без смарт-подсказок старым пташкам очень больно. У str есть метод startwith, но правильно его написать — startwith, там есть s, мне нужно проверить документ. (Тем не менее, я лично рекомендую, чтобы новички все еще использовали редактор для ввода кода вручную, чтобы углубить их память)
2. В процессе компиляции можно обнаружить только синтаксические ошибки, а о проблеме несоответствия типов можно узнать только при реальном запуске программы. Хотя это можно обойти с помощью модульного тестирования, не было бы лучше, если бы IDE указывала нам на это в процессе кодирования.
3. Вызов интерфейса полностью зависит от аннотаций документации, при вызове метода или функции возвращаемое значение и описания типов параметров могут быть определены только в соответствии с документацией. Хотя мы можем попросить программистов использовать строки документации или комментарии для описания типов параметров и типов возвращаемых значений функций, одна проблема заключается в том, что даже если вы правильно пишете строки документации в начале, после обновления кода ваши строки документации могут не обновляется синхронно.
Эти проблемы особенно заметны в крупномасштабных проектах, особенно в проектах с участием нескольких человек. Спецификация кода и проверка кода становятся все более важными. Из-за этих проблем призыв сообщества к введению функций статического типа становится все сильнее и сильнее, поэтому в Python 3.5, который является PEP484, есть Type Hints. При определении функции вы можете указать тип возвращаемого значения и тип параметра функции.
Раньше я писал такую функцию:
def greeting(name):
return "Hello" + name
>>> greeting("bob")
'Hellobob'
>>> greeting(1)
TypeError: must be str, not int
Когда вы не смотрите документацию или исходный код, вы понятия не имеете, какой тип значения вы можете передать, а когда вы передаете целое число 1, вы можете найти ошибку только при запуске программы, если есть проверка типа данных Инструмент может избежать ошибок программы, проверяя его перед запуском программы.
В Python 3.5 Type Hint записывается так:
def greeting(name: str) -> str:
return 'Hello ' + name
Выше приведен метод записи статического типа, с дополнительными ":str" и "->str", первый используется для указания типа имени, а второй - тип возвращаемого значения функции. Таким образом, инструменты IDE, такие как PyCharm, также могут мгновенно находить проблемы в коде.
Конечно, в дополнение к IDE у нас также есть более мощный инструмент проверки статического типа под названием mypy, который также является инструментом проверки статического типа, реализованным GUIdo, отцом Python.
pip install mypy
$ mypy test.py
test.py:4: error: Argument 1 to "greeting" has incompatible type "int"; expected "str"
Благодаря подсказкам типов Python имеет лучшие результаты при вызове кода, рефакторинге и даже статическом анализе, что не только снижает нагрузку на проверку типов во время разработки, но, что более важно, благодаря типу. Подсказки обеспечивают единый эталонный стандарт для различных интеллектуальных подсказок. , рефакторинг и другие функции, которые раньше плохо выполнялись в инструментах разработки интеграции Python.
В некотором смысле, подсказки типов — это просто вспомогательная функция.Хотя мы добавили подсказки типов данных, для интерпретатора Python он будет напрямую игнорировать информацию подсказок типов, и даже если тип неверен, это не помешает запуску программы. .
Что касается типа переменной, то в PEP484 его можно объяснить аннотацией типа, то есть тип переменной поясняется в виде аннотации, например:
from typing import List
x = [] # type: List[Employee]
y = [1, 2] # type: List[int]
y.append("a")
Приведенная выше аннотация типа указывает, чтоx
Должен быть список объектов Employee,y
Должен быть список целых чисел, список целых чиселy
После добавления строки мы используем mypy, чтобы проверить, что не так с кодом:
mypy test.py
xx.py:3: error: Name 'Employee' is not defined
xx.py:5: error: Argument 1 to "append" of "list" has incompatible type "str"; expected "int"
В Python 3.6, который является предложением PEP526, аннотация переменной дополнительно оптимизирована, а объявление типа используется как часть грамматики, которая более удобочитаема, чем аннотация, например:
my_var: int # 声明为整数类型的变量
my_var = 5 # 通过类型检查
other_var: int = 'a' # 给整数类型变量赋值字符串,检查器会报错,但是解释器运行是不会有任何问题
print(other_var)
mypy xx.py # 运行类型检查器
xx.py:3: error: Incompatible types in assignment (expression has type "str", variable has type "int")
python test.py # 运行解释器
a
Хотя подсказки типов приносят большое удобство интеллектуальным подсказкам и рефакторингу IDE, именно из-за объявления этих сведений о типах динамические языки раздуваются, например:
T = TypeVar('T')
S = TypeVar('S')
class Foo(Generic[T]):
def method(self, x: T, y: S) -> S:
# Body
Это общая аннотация, которая ничем не отличается от кода Java. По иронии судьбы, в Java также начали добавлять динамические языковые функции. Например, в Java 10 есть функция вывода типа локальной переменной. Вы можете использовать ключевое слово var для определения переменных без указания типов данных, что означает, что статические языки также Начните развиваться в направлении динамических языковых функций.
public class VarTest {
public static void main(String[] args) {
var name = "java";
System.out.println(name);
}
}
Итак, лучше ли использовать статический язык или динамический язык, Java и Python, как представители статических и динамических языков, имеют очевидную особенность, которую они оба извлекают из преимуществ друг друга. Ни один язык не идеален. Python гибок, но не так управляем. Он больше похож на открытый родитель, предоставляющий разработчикам наибольшую свободу в обработке языка. Ведь Мы все взрослые люди по обоюдному согласию! С другой стороны, Java, как строгий родитель, бережно относится к каждому разработчику, чтобы вы не попали в беду.