Именованные аргументы 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Дополнительные примеры с пояснениями
Пример 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')) # 127 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