This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: Cannot use dict with unicode keys as keyword arguments
Type: enhancement Stage:
Components: Unicode Versions:
process
Status: closed Resolution: wont fix
Dependencies: Superseder:
Assigned To: Nosy List: complex, georg.brandl, lemburg, rhettinger
Priority: normal Keywords:

Created on 2007-05-03 22:49 by complex, last changed 2022-04-11 14:56 by admin. This issue is now closed.

Messages (5)
msg55096 - (view) Author: Viktor Ferenczi (complex) Date: 2007-05-03 22:49
Unicode strings cannot be used as keys in dictionaries passed as keyword argument to a function. For example:

Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> def fn(**kw):
...     print repr(kw)
...
>>> fn(**{u'x':1})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: fn() keywords must be strings
>>>

Unicode strings should be converted to str automatically using the site specific default encoding or something similar solution.

This bug caused problems when decoding dictionaries from data formats such as XML or JSON. Usually unicode strings are returned from such modules, such as simplejson. Manual encoding from unicode to str causes performance loss if this cannot be done by Python automatically.
msg55097 - (view) Author: Georg Brandl (georg.brandl) * (Python committer) Date: 2007-05-04 04:10
In any case, this is a feature request.
msg55098 - (view) Author: Marc-Andre Lemburg (lemburg) * (Python committer) Date: 2007-05-04 10:27
Python (currently) does not allow non-ASCII identifiers, so it's not surprising that Unicode parameter names don't work.

It's also a really bad idea to pass data from an AJAX XML or JSON request directly to a function without doing at least some post-processing of the data in order to prevent DOS attacks, code injection, etc.

dict((str(key), value) for key, value in kw.iteritems()) is all that's needed for the above. 

BTW, I don't think those few micro-seconds really matter in the face of XML or JSON decoding, network latency, etc. ;-)
msg55099 - (view) Author: Raymond Hettinger (rhettinger) * (Python committer) Date: 2007-05-18 23:53
Recommend closing this as not-a-bug. 
msg55100 - (view) Author: Georg Brandl (georg.brandl) * (Python committer) Date: 2007-05-19 18:14
Yeah, should be uncontroversial.
History
Date User Action Args
2022-04-11 14:56:24adminsetgithub: 44926
2007-05-03 22:49:23complexcreate