Механизм передачи параметров в Python

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

Основы приёма аргументов в Python

Как объявить функцию, которая принимает как позиционные, так и именованные аргументы с возможностью задания значений по умолчанию?

Базовое решение использует комбинацию позиционных и именованных параметров.

def greet(name, greeting='Здравствуйте', punctuation='!'):
    return f'{greeting}, {name}{punctuation}'

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

В этом примере name - обязательный позиционный аргумент, greeting и punctuation - необязательные именованные аргументы со значениями по умолчанию. При вызове можно передать только обязательный аргумент, одно из значений или все три:

print(greet('Анна'))
print(greet('Анна', 'Привет'))
print(greet('Анна', 'Hello', '!'))
print(greet('Анна', punctuation='?'))

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

Здравствуйте, Анна!
Привет, Анна!
Hello, Анна!
Здравствуйте, Анна?

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

Типичные ошибки при работе с базовым подходом:

  • Пропуск обязательного аргумента (TypeError: missing required positional argument).
  • Попытка передать позиционный аргумент после именованного (SyntaxError: positional argument follows keyword argument).
  • Изменяемые объекты в значениях по умолчанию (например, def f(x=[])) - они сохраняются между вызовами и могут привести к неожиданному поведению. Решением является использование None и создание объекта внутри функции.

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

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

Используйте оператор *args в определении функции. Параметр args собирает все переданные позиционные аргументы в кортеж.

def sum_all(*args):
    return sum(args)

print(sum_all(1, 2, 3, 4, 5))

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

15

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

Распространённая проблема - путать *args с **kwargs или пытаться передать именованные аргументы в функцию, ожидающую только *args (они будут проигнорированы или вызовут ошибку).

Также нельзя использовать *args после уже собранных именованных аргументов в той же сигнатуре - это нарушает порядок параметров.

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

Оператор **kwargs собирает все переданные именованные аргументы в словарь.

def print_kwargs(**kwargs):
    for key, value in kwargs.items():
        print(f'{key} = {value}')

print_kwargs(name='Анна', age=30, city='Москва')

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

name = Анна
age = 30
city = Москва

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

Ошибка: попытка передать позиционный аргумент в функцию, ожидающую только **kwargs (вызовет TypeError).

Именованные аргументы внутри **kwargs не могут быть проверены на наличие статически - все проверки нужно выполнять вручную.

Как комбинировать *args и **kwargs вместе?

Если функция должна принимать как произвольные позиционные, так и произвольные именованные аргументы, используйте оба оператора. Порядок в сигнатуре: обычные параметры, затем *args, затем **kwargs.

def wrapper(*args, **kwargs):
    print('Позиционные:', args)
    print('Именованные:', kwargs)

wrapper(1, 2, name='test', flag=True)

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

Позиционные: (1, 2)
Именованные: {'name': 'test', 'flag': True}

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

Типичная ошибка - нарушение порядка: **kwargs не может следовать за *args - это синтаксически верно, но **kwargs всегда должен быть последним.

Также стоит помнить, что все обычные параметры должны быть указаны до *args.

Как создать функцию, принимающую только именованные аргументы?

Поместите одиночный символ * в сигнатуре функции. Все параметры, идущие после него, становятся только именованными (keyword-only).

def create_profile(*, name, age):
    return f'Профиль: {name}, возраст {age}'

# create_profile('Анна', 30)  # TypeError: create_profile() takes 0 positional arguments
print(create_profile(name='Анна', age=30))

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

Профиль: Анна, возраст 30

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

Частая ошибка - забыть поставить * и передать позиционные аргументы, которые не ожидаются. Python выдаст TypeError: takes 0 positional arguments but ... was given.

Как создать функцию, принимающую только позиционные аргументы?

Начиная с Python 3.8, можно использовать символ / в сигнатуре. Все параметры, идущие до него, являются только позиционными (positional-only).

def divide(a, b, /):
    return a / b

print(divide(10, 2))
# print(divide(a=10, b=2))  # TypeError: divide() got some positional-only arguments passed as keyword arguments

Python передать аргументы (передача аргументов в python)

5.0

Python принять аргументы (приём аргументов в python)

Если попытаться вызвать функцию с именованными аргументами для параметров до /, возникнет TypeError.

Важно помнить, что / используется в сочетании с другими параметрами. Порядок: positional-only, затем /, затем обычные (позиционные + именованные), затем *, затем keyword-only.

Как добавить аннотации типов к аргументам функции?

Аннотации типов (type hints) помогают статическим анализаторам и IDE понять ожидаемые типы. Они не накладывают ограничений на выполнение.

def greet(name: str, times: int = 1) -> str:
    return f'{name}! ' * times

print(greet('Анна', 3))

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

Анна! Анна! Анна! 

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

Аннотации не проверяются на этапе выполнения - передача аргумента неправильного типа не вызовет ошибки. Для проверки на практике используйте сторонние инструменты (mypy, pydantic).

Также не следует путать аннотации с дефолтными значениями - запись name: str = 'Мир' допустима.

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

При вызове можно распаковать итерируемый объект в позиционные аргументы с помощью * и словарь в именованные с помощью **.

def point(x, y, z):
    return (x, y, z)

coords = [1, 2, 3]
print(point(*coords))

data = {'x': 10, 'y': 20, 'z': 30}
print(point(**data))

Python return value (возвращаемое значение функции в python)

(1, 2, 3)
(10, 20, 30)

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

- значения функции python (значения функции в python)
- вывести значение функции python (вывести значение функции в python)
- вызов функции в python (вызов функции в python)

Расширенные примеры приёма аргументов

1. Использование inspect для динамического анализа сигнатуры функции

Пример
import inspect

def sample(a, b=10, *args, **kwargs):
    pass

sig = inspect.signature(sample)
for name, param in sig.parameters.items():
    print(f'{name}: kind={param.kind.name}, default={param.default}')
a: kind=POSITIONAL_OR_KEYWORD, default=inspect._empty
b: kind=POSITIONAL_OR_KEYWORD, default=10
args: kind=VAR_POSITIONAL, default=inspect._empty
kwargs: kind=VAR_KEYWORD, default=inspect._empty

Этот приём полезен для создания декораторов, валидаторов или библиотек, работающих с произвольными функциями.

2. Передача аргументов из словаря с частичным перекрытием

Пример
def func(a, b, c, d=0):
    return a + b + c + d

base = {'a': 1, 'b': 2, 'c': 3}
extra = {'d': 10}
print(func(**base, **extra))
# print(func(**base, **{'a': 100}))  # TypeError: got multiple values for argument 'a'
16

Важно избегать дублирования ключей - Python выдаст ошибку.

3. *args в декораторе для передачи аргументов обёрнутой функции

Пример
def debug(func):
    def wrapper(*args, **kwargs):
        print(f'Вызов {func.__name__} с args={args}, kwargs={kwargs}')
        return func(*args, **kwargs)
    return wrapper

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

print(add(3, 4))
print(add(x=10, y=20))
Вызов add с args=(3, 4), kwargs={}
7
Вызов add с args=(), kwargs={'x': 10, 'y': 20}
30

4. Частичное применение с functools.partial

Пример
from functools import partial

def power(base, exponent):
    return base ** exponent

square = partial(power, exponent=2)
cube = partial(power, exponent=3)

print(square(5))
print(cube(2))
25
8

partial фиксирует часть аргументов, создавая новую функцию с меньшей арностью.

5. Распаковка строк и итераторов при вызове

Пример
def concatenate(*strings):
    return ''.join(strings)

letters = 'abc'
print(concatenate(*letters))

# Работа с любым итератором:
nums = range(1, 5)
print(concatenate(*map(str, nums)))
abc
1234

6. Использование только именованных аргументов для улучшения читаемости API

Пример
def connect_db(*, host='localhost', port=5432, user, password):
    return f'Соединение с {host}:{port} пользователь {user}'

# connect_db('localhost', 'admin')  # TypeError
print(connect_db(user='admin', password='secret'))
print(connect_db(host='example.com', user='admin', password='123'))
Соединение с localhost:5432 пользователь admin
Соединение с example.com:5432 пользователь admin

Такой подход делает код самодокументируемым и предотвращает ошибки из-за путаницы позиций.

7. Позиционно-ключевые параметры с / и * вместе

Пример
def complex_func(a, b, /, c, d, *, e, f):
    return (a, b, c, d, e, f)

# a и b - только позиционные; c и d - обычные; e и f - только именованные
print(complex_func(1, 2, 3, d=4, e=5, f=6))
# print(complex_func(a=1, b=2, 3, d=4, e=5, f=6))  # SyntaxError: positional argument follows keyword argument
# print(complex_func(1, 2, 3, 4, 5, 6))  # TypeError: missing required keyword-only arguments
(1, 2, 3, 4, 5, 6)

Комбинация этих символов даёт тонкий контроль над интерфейсом функции.

Приём аргументов в Python - comments

En
Python принять аргументы (python)