Гибкие функции: именованные параметры в Python
Основное применение именованных аргументов
Именованные аргументы (keyword arguments) позволяют передавать значения в функцию, указывая имя параметра. Это повышает читаемость кода и устраняет зависимость от порядка аргументов.
def greet(name, greeting):
print(f"{greeting}, {name}!")
greet(name="Alice", greeting="Hello")
greet(greeting="Hi", name="Bob")
аргументы print python (аргументы функции print в python)
Hello, Alice! Hi, Bob!
Python 3 аргументы (аргументы в python 3)
Типичные ошибки:
- Попытка передать именованный аргумент после позиционного, когда функция ожидает только позиционные – SyntaxError.
- Использование имени параметра, которого нет в определении функции – TypeError.
Как сделать функцию, принимающую только именованные аргументы?
Используйте символ * (звёздочка) в определении функции. Все параметры после звёздочки могут быть переданы только по имени.
def configure(*, host, port, debug):
print(f"Host: {host}, Port: {port}, Debug: {debug}")
configure(host="localhost", port=8080, debug=True)
# configure("localhost", 8080, True) # TypeError
аргумент параметр python (аргументы и параметры в python)
Host: localhost, Port: 8080, Debug: True
аргумент класса python (аргументы класса python)
Проблемы:
- Если забыть звёздочку, функция будет принимать позиционные аргументы, что может нарушить задумку.
Как передать произвольное количество именованных аргументов?
Используйте **kwargs (keyword arguments). В функцию можно передать любое количество именованных аргументов, которые будут собраны в словарь.
def create_profile(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
create_profile(name="Alice", age=30, city="New York")
Python аргументы строки (аргументы строки в python (командная строка))
name: Alice age: 30 city: New York
аргумент метода python (аргументы метода python)
Типичные ошибки:
- Имена ключей должны быть валидными идентификаторами Python.
- При передаче аргументов с одинаковыми именами возникает синтаксическая ошибка.
Как совместить позиционные и именованные аргументы?
В определении функции сначала идут позиционные параметры, затем могут следовать именованные (со значениями по умолчанию) и, при необходимости, *args и **kwargs.
def connect(host, port, timeout=30, *, use_ssl=False):
print(f"Connecting to {host}:{port}, timeout={timeout}, ssl={use_ssl}")
connect("localhost", 8080, use_ssl=True)
connect("localhost", 8080, timeout=60)
Python args (аргументы в python)
Connecting to localhost:8080, timeout=30, ssl=True Connecting to localhost:8080, timeout=60, ssl=False
именованные аргументы функции python (именованные аргументы функции python)
Проблемы:
- Порядок: позиционные аргументы должны быть переданы раньше именованных.
- Если параметр после звёздочки не имеет значения по умолчанию, он обязателен и должен быть передан по имени.
Как задать значения по умолчанию для именованных аргументов?
Достаточно присвоить значение параметру в определении функции. Такие аргументы становятся необязательными.
def send_email(to, subject="No Subject", body=""):
print(f"To: {to}, Subject: {subject}")
send_email("user@example.com")
send_email("user@example.com", subject="Hello", body="Hi there!")
именованные аргументы python (именованные аргументы python)
To: user@example.com, Subject: No Subject To: user@example.com, Subject: Hello
количество аргументов функции python (количество аргументов функции python)
Типичные ошибки:
- Изменяемые объекты (списки, словари) в качестве значения по умолчанию могут привести к неожиданному поведению, так как они создаются один раз при определении функции.
Как передать словарь в функцию как именованные аргументы?
Оператор распаковки ** позволяет развернуть словарь в именованные аргументы при вызове функции.
def show_info(name, age, city):
print(f"{name} is {age} years old, lives in {city}")
user_data = {"name": "Bob", "age": 25, "city": "London"}
show_info(**user_data)
параметры и аргументы функции python (параметры и аргументы функции python)
Bob is 25 years old, lives in London
Проблемы:
- Ключи словаря должны точно соответствовать именам параметров, иначе TypeError.
- Если в словаре есть лишние ключи, при распаковке возникнет ошибка, если функция не принимает **kwargs.
Расширенные примеры использования именованных аргументов
Декоратор с логированием аргументов
import functools
def log_call(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print(f"Вызов {func.__name__} с args={args}, kwargs={kwargs}")
return func(*args, **kwargs)
return wrapper
@log_call
def multiply(a, b, c=1):
return a * b * c
print(multiply(2, 3, c=4))
Вызов multiply с args=(2, 3), kwargs={'c': 4}
24
Передача **kwargs в несколько функций
def validate(name, age):
if not name or age < 0:
return False
return True
def save(name, age, **extra):
if validate(name=name, age=age):
print(f"Сохранено: {name}, {age}. Дополнительно: {extra}")
else:
print("Ошибка валидации")
save(name="Alice", age=30, city="Paris")
Сохранено: Alice, 30. Дополнительно: {'city': 'Paris'}
Распаковка словаря в конструкторе класса
class Person:
def __init__(self, name, age, **extras):
self.name = name
self.age = age
for key, value in extras.items():
setattr(self, key, value)
data = {"name": "Bob", "age": 25, "city": "NYC", "job": "Engineer"}
p = Person(**data)
print(vars(p))
{'name': 'Bob', 'age': 25, 'city': 'NYC', 'job': 'Engineer'}
Использование с partial из functools
from functools import partial
def power(base, exp):
return base ** exp
square = partial(power, exp=2)
cube = partial(power, exp=3)
print(square(base=5))
print(cube(base=2))
25 8
Аннотации типов и именованные аргументы
def create_user(name: str, age: int, is_admin: bool = False) -> dict:
return {"name": name, "age": age, "admin": is_admin}
user = create_user(name="Carol", age=28, is_admin=True)
print(user)
{'name': 'Carol', 'age': 28, 'admin': True}