*content
не является аргументом. Вы не можете ничего присвоить ему.
Документы действительно не объясняют это явно. Это просто переменная, которую вы можете использовать в теле функции. Что он делает, так это «собирает все оставшиеся входные аргументы».
Обычно эти переменные c аргументы будут последними в списке формальных параметров, потому что они coop вверх все оставшиеся входные аргументы, которые передаются функции.
https://docs.python.org/3/tutorial/controlflow.html#arbitrary -argument-lists
Эта функция
def func(*args, **kwargs):
print("args", args)
print("kwargs", kwargs)
func(args=[1, 2, 3])
напечатает
args ()
kwargs {'args': [1, 2, 3]}
РЕДАКТИРОВАТЬ:
Ваши примеры неверны. Вы не можете получить другой результат.
Для этой функции
def tag(name, *content, cls=None, **attrs):
if cls is not None:
attrs['class'] = cls
if attrs:
attr_str = ''.join(' %s="%s"' % (key, val)
for key, val
in sorted(attrs.items()))
else:
attr_str = ''
if content:
resp = '\n'.join('<%s%s>%s</%s>' % (name, attr_str, c, name) for c in content)
else:
resp = '<%s%s />' % (name, attr_str)
print("name", name)
print("*content", content)
print("cls", cls)
print("attrs", attrs)
print("attrs_str", attr_str)
print("resp", resp)
print('-'*10)
return resp
Если вы запустите это
tag('div', 'testing', cls='test', **dict(id=33, alt='this is a test'))
tag(**dict(name='div', content=('testing','and testing'), cls='test', id=33, alt='this is a test'))
, вы получите
name div
*content ('testing',)
cls test
attrs {'id': 33, 'alt': 'this is a test', 'class': 'test'}
attrs_str alt="this is a test" class="test" id="33"
resp <div alt="this is a test" class="test" id="33">testing</div>
----------
name div
*content ()
cls test
attrs {'content': ('testing', 'and testing'), 'id': 33, 'alt': 'this is a test', 'class': 'test'}
attrs_str alt="this is a test" class="test" content="('testing', 'and testing')" id="33"
resp <div alt="this is a test" class="test" content="('testing', 'and testing')" id="33" />
----------
Значит, во втором случае '<div alt="this is a test" class="test" id="33" />'
не должно быть. Я получаю <div alt="this is a test" class="test" content="('testing', 'and testing')" id="33" />
для той же самой функции.
РЕДАКТИРОВАТЬ 2: Вероятно, ваше пространство имен нарушено, поскольку имя **kwargs
часто используется где-то еще, как вы используете здесь **attrs
, поэтому измените имя этого модуля / прямая функция импорта должна решить вашу проблему.