<div dir="ltr"><div dir="ltr"><br><br><div class="gmail_quote"><div dir="ltr">On Thu, Oct 4, 2018 at 10:58 AM Steven D'Aprano <<a href="mailto:steve@pearwood.info">steve@pearwood.info</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">While keyword arguments have to be identifiers, using **kwargs allows <br>
arbitrary strings which aren't identifiers:<br>
<br>
py> def spam(**kwargs):<br>
...     print(kwargs)<br>
...<br>
py> spam(**{"something arbitrary": 1, '\n': 2})<br>
{'something arbitrary': 1, '\n': 2}<br>
<br>
<br>
There is some discussion on Python-Ideas on whether or not that <br>
behaviour ought to be considered a language feature, an accident of <br>
implementation, or a bug.<br><br></blockquote><div><br></div><div>I would expect this to be costly/annoying for implementations to enforce, doing it at call time is probably too late to be efficient, it would need help from dicts themselves or even strings.</div><div><br></div><div>A hack that currently works because of this is with dict itself:</div><div><br></div><div><div>>>> d = {'a-1': 1, 'a-2': 2, 'a-3': 3}</div><div>>>> d1 = dict(d, **{'a-2': -2, 'a-1': -1})</div><div>>>> d1 is d</div><div>False</div><div>>>> d1</div><div>{'a-1': -1, 'a-2': -2, 'a-3': 3}</div><div>>>> </div></div><div><br></div><div><br></div><div><br></div><div> </div></div></div></div>