Гибкие функции: именованные параметры в Python

Раздел: 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.
- Python список аргументов (список аргументов в python)
- Python тип аргумента (тип аргумента в python)
- Python функция в качестве аргумента (функция как аргумент в python)

Расширенные примеры использования именованных аргументов

Декоратор с логированием аргументов

Пример

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}

Именованные аргументы Python - comments

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