да выбрасывает ексепшен, но выброс ексепшена == борьба со следствиями, а именно с кодинжекшеном.
>>> class Foo():
... def __init__(self, **kw):
... print(kw)
...
>>> d = {'self': 'abc', 'a': 1, 'b': 2}
>>>
>>> Foo(**d)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() got multiple values for argument 'self'
Ща адепты мне расскажут что так делать нельзя.
Типа в шаблон jinja нельзя передавать self. Придумайте новое имя. Ага.
Для специалистов: если атаковать не первый параметр (self), а скажем опциональный, то будет весело:
>>> class Foo():
... def __init__(self, a=None, **kw):
... print('a=', a, kw)
...
>>> d = {'self1': 'abc', 'a': 1, 'b': 2}
>>>
>>> Foo(**d)
a= 1 {'self1': 'abc', 'b': 2}
<__main__.Foo object at 0x7f9a14ec5a58>
>>>