Рубрики
Без рубрики

Нуждаются ли типы Python?

Я большой поклонник Python. Это, безусловно, самый простой язык общего назначения, который вы можете просто выбрать … Tagged с питоном, типами, Mypy.

Я большой поклонник Python. Это, безусловно, самый простой язык общего назначения, который вы можете просто взять и начать строить удивительные вещи.

Но в течение прошлого года я работал над проектами Frontend, и мне очень понравилось использовать TypeScript Анкет По сути, это JavaScript, но с причудливыми функциями, построенными сверху, как Статическая проверка типа и Нулевая безопасность , и это было Потрясающие Насколько это помогло в написании надежного, бесплатного кода.

Поэтому я вышел, чтобы найти, есть ли у Python такой эквивалент, и, конечно же, это было.

Это называется mypy , и это удивительно. Это работает так хорошо в процессе, что я никогда не смогу вернуться к написанию простого Python сейчас-и эта статья будет вашим введением к нему.

Но прежде чем все это , давайте выясним, в чем дело Типы .

Почему типы?

По сути, это означает, что если у вас есть система типа, Каждая переменная имеет заранее назначенный тип, связанный с ней .

Обратите внимание, что, хотя это может не выглядеть так, напечатанная версия является совершенно допустимым кодом Python.

Что это значит, так это то, что вы не можете передать значения неправильного типа нигде. Типовый шахер не позволяет вам.

Что чрезвычайно ценно, если вы думаете об этом – я потерял счет, сколько TypeError S. Я видел на Python на протяжении многих лет!

Просто уверенность в том, что в вашем коде нет такого места, где случайно прошел str где int Ожидалось, что устраняет целый класс ошибок из вашей кодовой базы.

Не только это – вы получаете кучу других преимуществ, а именно:

  • Самодокументирующий код
  • Нет -осведомленность
  • Лучшее автозаполнение и поддержка IDE

Я подробно расскажу о всех этих моментах.

Самодокументирующий код

Представьте, что у вас есть этот кусок кода:

def add_orders(self, orders):
    for order in orders:
        self.pending_ids.add(order.id)

Кажется довольно простым, не так ли? Кажется, у нас есть список Заказ и мы добавляем идентификатор каждого заказа в набор под названием wending_ids Анкет

Но что такое порядок Здесь …

Трудно сказать. В большой кодовой базе вам, возможно, придется найти довольно сложно, чтобы выяснить, какая часть кода вызывает add_orders и откуда поступают данные, чтобы в конечном итоге узнать, что это должно быть просто NALITTUPLE Анкет

Как насчет этого:

from models import Order

def add_orders(self, orders: list[Order]) -> None:
    for order in orders:
        self.pending_ids.add(order.id)

Теперь мгновенно ясно, что везде add_orders используется, это будет точно такого типа.

Без осознания

Под этим я имею в виду, что вы не только не можете передать неправильные типы значений, вы также не можете передать значения, которые могут быть Нет , в местах, которые не ожидают, что ценность может быть, возможно, Нет Анкет

Вот пример:

User = namedtuple('User', ['name', 'favorites'])

def fetch_users():
    users = []
    for _ in range(3):
        user_dict = get_user_from_api()
        user = User(
            name=user_dict.get('name', 'Anonymous'),
            favorites=user_dict.get('favorites')
        )
        users.append(user)

    return users

def print_favorite_colors(users):
    for user in users:
        print(user.favorites.get('color'))

users = fetch_users()
print_favorite_colors(users)

… и на первом взгляде это выглядит нормально. Мы используем .получить Так что мы не должны получать Keyerror где угодно, так что у нас все должно быть в порядке, верно?

Теперь вот напечатанная версия того же кода:

class User(NamedTuple):
    name: str
    favorites: Optional[dict[str, str]]

def fetch_users() -> list[User]:
    users = []
    for _ in range(3):
        user_dict = get_user_from_api()
        user = User(
            name=user_dict.get('name', 'Anonymous'),
            favorites=user_dict.get('favorites')
        )
        users.append(user)

    return users


def print_favorite_colors(users: list[User]) -> None:
    for user in users:
        print(user.favorites.get('color'))


users = fetch_users()
print_favorite_colors(users)

И как только вы добавляете типы, вы видите одну ошибку:

Вы забыли, что user.favorites не может быть никого, что сработало бы все ваше приложение.

Хорошо, что Mypy поймала это до того, как ваши клиенты сделали.

Лучшее автозаполнение и поддержка IDE

Честно говоря, это моя любимая часть работы с Typed Python. Количество статических типов автоматического заполнения меня удивительно, и это повышает мою производительность в десять раз, потому что мне редко приходится больше открывать документацию.

Где я могу его использовать?

Теперь я слышу, как вы говорите: «Все это звучит очень круто. Но где я могу использовать эту Mypy-sthith в моей кодовой базе Python? “

И оказывается, Вы можете постепенно добавлять типы в существующую кодовую базу Python , одна функция и один класс за раз. Он выведет как можно больше информации из количества информации о типах, у нее есть, и уменьшит ваши ошибки, независимо от того, насколько маленьким вы начинаете.

Вывод

Итак, это было мое введение в вас, в мир статической проверки типа в Python. Вы заинтересованы в том, чтобы узнать больше об этом? Я очень скоро брошу подробное руководство по Mypy, так что следите за обновлениями.

Я также хотел бы услышать ваши мысли об этой статье, так что дайте мне знать, что вы думаете о Mypy в комментариях.

Оригинал: “https://dev.to/tusharsadhwani/does-python-need-types-59if”