Именованные аргументы Python: синтаксис, применение и лучшие практики

Раздел: Python -> Функции

Основная техника: именованные аргументы для читаемости и гибкости

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

def connect(host, port, timeout):
    pass

connect(host='localhost', port=8080, timeout=30)

аргументы print python (аргументы функции print в python)

В этом примере все аргументы переданы по имени. Порядок не важен, а вызов очевиден.

Проблема: как сделать аргументы необязательными?

Для необязательных параметров задают значения по умолчанию. Тогда можно опускать их при вызове.

def create_user(name, age=None, active=True):
    return f'{name}, {age}, {active}'

print(create_user('Анна', active=False))
print(create_user('Иван'))

Python 3 аргументы (аргументы в python 3)

Анна, None, False
Иван, None, True

аргумент параметр python (аргументы и параметры в python)

Типичная ошибка: изменяемые объекты по умолчанию

Если в качестве значения по умолчанию использовать список или другой изменяемый объект, он будет общим для всех вызовов.

def add_item(item, lst=[]):
    lst.append(item)
    return lst

print(add_item(1))
print(add_item(2))

аргумент класса python (аргументы класса python)

[1]
[1, 2]

Python аргументы строки (аргументы строки в python (командная строка))

Решение: использовать None и создавать новый объект внутри функции.

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

После символа * все параметры становятся keyword-only – их можно передавать только по имени.

def send_request(method, *, url, headers=None):
    print(method, url, headers)

send_request('GET', url='/api', headers={'Auth':'token'})
# send_request('GET', '/api')  # Ошибка: positional argument

аргумент метода python (аргументы метода python)

Когда это полезно?

Такая сигнатура защищает от случайного перепутывания аргументов, особенно когда много параметров одного типа.

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

**kwargs собирает все избыточные именованные аргументы в словарь.

def configure(**kwargs):
    for key, val in kwargs.items():
        print(f'{key}: {val}')

configure(host='10.0.0.1', port=3306, debug=True)

Python args (аргументы в python)

host: 10.0.0.1
port: 3306
debug: True

именованные аргументы функции python (именованные аргументы функции python)

Ошибка: дублирование имён

Если вручную передать ключ, совпадающий с именем другого параметра, возникнет конфликт.

Как комбинировать позиционные, именованные и произвольные?

Порядок: обычные позиционные, *args (кортеж), keyword-only, **kwargs (словарь).

def func(a, b, *args, c=10, **kwargs):
    pass
- параметры и аргументы функции python (параметры и аргументы функции python)
- Python передать аргументы (передача аргументов в python)
- переменное количество аргументов python (переменное количество аргументов python)

Дополнительные примеры с пояснениями

Пример 1: смешанная передача и проверка типов

Пример
def calc(a, b, *, operation='sum'):
    if operation == 'sum':
        return a + b
    elif operation == 'mul':
        return a * b

print(calc(3, 4))                 # 7
print(calc(3, 4, operation='mul')) # 12
print(calc(a=3, b=4, operation='mul')) # 12
7
12
12

Здесь operation – keyword-only, что заставляет явно указывать его имя, избегая путаницы.

Пример 2: декоратор с передачей именованных аргументов

Пример
import functools

def log_args(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print(f'Вызвана {func.__name__} с args={args}, kwargs={kwargs}')
        return func(*args, **kwargs)
    return wrapper

@log_args
def add(x, y):
    return x + y

add(10, y=20)  # args=(10,), kwargs={'y': 20} -> результат 30
Вызвана add с args=(10,), kwargs={'y': 20}
30

Пример 3: принудительное разделение позиционных и именованных через *

Пример
def plot(x, y, *, color='blue', label=None):
    print(f'Точка ({x}, {y}) цвет={color}, метка={label}')

plot(1, 2)                          # использует умолчание цвета
plot(1, 2, color='red')             # меняем цвет
plot(x=1, y=2, color='green', label='A') # полностью именованный

Пример 4: передача словаря с распаковкой **

Пример
def show_info(name, age, city):
    print(f'{name}, {age} лет, из {city}')

data = {'name': 'Мария', 'age': 25, 'city': 'Москва'}
show_info(**data)   # эквивалент show_info(name='Мария', age=25, city='Москва')
Мария, 25 лет, из Москва

Пример 5: ошибка из-за неверного имени

Пример
def greet(name, greeting='Привет'):
    print(f'{greeting}, {name}')

greet(name='Анна', gret='Здравствуйте')  # TypeError: unexpected keyword argument 'gret'
TypeError: greet() got an unexpected keyword argument 'gret'

Проблема решается проверкой допустимых ключей или использованием **kwargs.

Пример 6: принудительный порядок с помощью именованных аргументов в классах

Пример
class Point:
    def __init__(self, *, x=0, y=0):
        self.x = x
        self.y = y

p1 = Point(x=10, y=20)
p2 = Point(y=5)   # x=0 по умолчанию
# p3 = Point(10, 20)  # TypeError: __init__() takes 1 positional argument

Именованные аргументы функции Python - comments

En
именованные аргументы функции python (python)