Python - Positional-Only Arguments: A Beginner's Guide (Русский)

Привет, начинающие энтузиасты Python! Сегодня мы отправляемся в увлекательное путешествие по миру Python, где исследуем концепцию под названием "Аргументы только по позиции". Не волнуйтесь, если это звучит сложно — к концу этого урока вы будете использовать этот термин как профи!

Python - Positional-Only Arguments

Что такое аргументы в Python?

Перед тем как погружаться в глубины, начнем с основ. В Python, когда мы создаем функции, часто нужно передавать им информацию. Эта информация называется "аргументами". Представьте себе аргументы как ингредиенты, которые вы передаете в рецепт (функцию), чтобы приготовить вкусное блюдо (выход).

Например:

def приветствие(имя):
print(f"Привет, {имя}!")

приветствие("Алиса")

В этой простой функции, имя — это аргумент. Когда мы вызываем функцию с приветствие("Алиса"), "Алиса" — это значение, которое мы передаем в аргумент имя.

Понимание позиционных аргументов

Теперь пойдем дальше. В Python есть разные способы передачи аргументов в функцию. Самый распространенный и прямой способ — это через позиционные аргументы. Это аргументы, которые идентифицируются по своему положению в вызове функции.

Посмотрим на пример:

def описание_животного(тип_животного, имя_животного):
print(f"У меня есть {тип_животного} по имени {имя_животного}.")

описание_животного("собака", "Бuddy")

В этой функции, тип_животного и имя_животного — это позиционные аргументы. Когда мы вызываем функцию, Python знает, что "собака" соответствует тип_животного, а "Бuddy" — имя_животного по их положению.

Введение в аргументы только по позиции

Теперь, когда мы понимаем позиционные аргументы, давайте поговорим о специальном типе: аргументы только по позиции. Это аргументы, которые должны быть предоставлены только по позиции и не могут быть переданы как аргументы с ключевыми словами.

В Python 3.8 и более поздних версиях мы можем определить параметры только по позиции, используя специальную синтаксис: символ переноса строки (/). Любой параметр перед / в определении функции считается только по позиции.

Посмотрим на пример:

def приветствие(имя, /, приветствие="Привет"):
print(f"{приветствие}, {имя}!")

приветствие("Чарли")  # Это работает
приветствие("Диана", "Привет")  # Это тоже работает
приветствие(имя="Ева")  # Это вызовет ошибку

В этой функции, имя — это аргумент только по позиции, потому что он стоит перед /. приветствие — обычный параметр, который может быть передан либо по позиции, либо как аргумент с ключевым словом.

Почему использовать аргументы только по позиции?

Вы можете подумать: "Почему бы мы хотели ограничить способ передачи аргументов?" Отличный вопрос! Есть несколько причин:

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

Примеры аргументов только по позиции

Давайте рассмотрим больше примеров, чтобы окончательно укрепить наше понимание:

Пример 1: Математические операции

def степень(основание, /, степень=2):
return основание ** степень

print(степень(2))  # Вывод: 4
print(степень(2, 3))  # Вывод: 8
print(степень(2, степень=3))  # Вывод: 8
print(степень(основание=2, степень=3))  # Это вызовет ошибку

В этом примере, основание — аргумент только по позиции, а степень может быть передана либо по позиции, либо как аргумент с ключевым словом.

Пример 2: Манипуляция строк

def повторить_строку(строка, /, раз=2):
return строка * раз

print(повторить_строку("Привет"))  # Вывод: ПриветПривет
print(повторить_строку("Привет", 3))  # Вывод: ПриветПриветПривет
print(повторить_строку("Вау", раз=4))  # Вывод: ВауВауВауВау
print(повторить_строку(строка="Ой", раз=2))  # Это вызовет ошибку

Здесь, строка должна быть передана позиционно, а раз может быть передан любым способом.

Пример 3: Комбинирование аргументов только по позиции и только с ключевыми словами

Python также позволяет определять аргументы только с ключевыми словами, используя звездочку (*). Давайте комбинируем это с аргументами только по позиции:

def форматировать_имя(имя, /, отчество, *, фамилия):
return f"{имя} {отчество} {фамилия}"

print(форматировать_имя("Джон", "Фицджеральд", фамилия="Кеннеди"))  # Это работает
print(форматировать_имя("Джон", отчество="Фицджеральд", фамилия="Кеннеди"))  # Это тоже работает
print(форматировать_имя(имя="Джон", отчество="Фицджеральд", фамилия="Кеннеди"))  # Это вызовет ошибку
print(форматировать_имя("Джон", "Фицджеральд", "Кеннеди"))  # Это тоже вызовет ошибку

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

Практические примеры использования

Теперь, когда мы понимаем, как работают аргументы только по позиции, рассмотрим некоторые реальные сценарии, где они могут быть полезны:

  1. Дизайн API: При создании общедоступных API использование аргументов только по позиции может предотвратить зависимость пользователей от имен параметров, которые могут измениться в будущих версиях.

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

  3. Имитация встроенных функций: Многие встроенные функции Python используют аргументы только по позиции. Если вы создаете обертку или аналогичную функцию, вы можете захотеть соответствовать этому поведению.

Общие ловушки и как избежать их

Хотя аргументы только по позиции могут быть мощными, они могут также привести к некоторому замешательству, если не использовать их внимательно. Вот некоторые общие ловушки и как избежать их:

  1. Забывание синтаксиса: Помните, что символ переноса строки (/) используется для обозначения аргументов только по позиции. Все, что перед ним, считается только по позиции.

  2. Перепутывание порядка аргументов: Так как аргументы только по позиции зависят от порядка, важно помнить правильную последовательность при вызове функции.

  3. Чрезмерное использование аргументов только по позиции: Не делайте каждый аргумент только по позиции. Это может сделать ваши функции менее гибкими и сложнее для использования.

Заключение

Поздравляем! Вы только что сделали глубокий погружение в мир аргументов только по позиции в Python. От понимания того, что это такое, до рассмотрения различных примеров, вы теперь оборудованы для использования этой функции в своих собственных программах на Python.

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

По мере продолжения вашего путешествия по Python, продолжайте экспериментировать с различными типами аргументов и определениями функций. Чем больше вы практикуетесь, тем естественнее эти концепции становятся. Счастливого кодирования, будущие мастера Python!

Метод Описание
def функция(арг, /) Определяет функцию с аргументом только по позиции
def функция(арг1, /, арг2) Определяет функцию с позиционным и обычным аргументами
def функция(арг1, /, арг2, *, арг3) Определяет функцию с позиционным, обычным и аргументом только с ключевым словом

Credits: Image by storyset