Зачем используется символ * в аргументах метода Python?

Каково значение символа звездочки (*) в аргументах функции namedtuple модуля collections? Я не могу найти эту информацию в документации и нигде раньше не сталкивался с таким.
  • 31 января 2024 г. 11:30
Ответы на вопрос 3
В Python символ `*` может использоваться в аргументах функций или методов для разных целей:

1. **Упаковка аргументов**: когда в определении функции перед параметром стоит `*`, это означает, что этот параметр будет собирать все позиционные аргументы, переданные в функцию, в кортеж. Это позволяет функциям принимать произвольное число позиционных аргументов.

```python
def func(*args):
    for arg in args:
        print(arg)

func(1, 2, 3)  # Выведет: 1 2 3
```

2. **Распаковка аргументов**: если перед итерируемым объектом, например, списком или кортежем, при вызове функции стоит `*`, то Python распакует элементы этого объекта и передаст их в функцию как отдельные позиционные аргументы.

```python
args = [1, 2, 3]
func(*args)  # Эквивалентно вызову func(1, 2, 3)
```

3. **Работа с именованными аргументами**: аналогично позиционным аргументам, две звездочки `**` применяются для упаковки и распаковки именованных аргументов (ключевых слов) в словарь и из словаря соответственно.

```python
def func(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

func(a=1, b=2)  # Выведет: a: 1 b: 2

kwargs = {'a': 1, 'b': 2}
func(**kwargs)  # Эквивалентно вызову func(a=1, b=2)
```

4. **Для разделения позиционных аргументов от именованных**: если в определении функции между позиционными аргументами и именованными аргументами стоит `*`, то все аргументы после звездочки можно передавать только как ключевые.

```python
def func(a, *, b):
    print(a, b)

func(1, b=2)  # Выведет: 1 2
# func(1, 2)  # Будет ошибка, так как 2 не может быть позиционным аргументом
```

Теперь, касательно `namedtuple` из модуля `collections`, `*` может использоваться для распаковки списка или кортежа полей, которые будут являться именами полей namedtuple.

Например:

```python
from collections import namedtuple

fields = ('id', 'name', 'age')
Record = namedtuple('Record', *fields)

# Это эквивалентно следующему определению:
Record = namedtuple('Record', 'id name age')
```

В данном случае `*fields` распакует кортеж `fields` и передаст содержащиеся в нем строки как отдельные аргументы в функцию `namedtuple`, что удобно, если у вас уже есть итерируемый объект со списком полей.
В Python звездочка (*) в списке аргументов метода используется для указания, что все аргументы после звездочки должны быть переданы как именованные аргументы. Это означает, что после звездочки все аргументы должны быть указаны с использованием их имен.
Что делает единичная звездочка в аргументах метода Python?

namedtuple(
typename,
field_names,
*,
rename=False,
defaults=None,
module=None,
)

Ни разу не встречал такое раньше, в документации тоже не смог откопать

PEP 3102
Похожие вопросы