Am 02.02.2012 12:02, schrieb Peter Otten:
Ulrich Eckhardt wrote:

  >>>  u'abc'.translate({u'a': u'A'})
u'abc'

I would call this a chance to improve Python. According to the
documentation, using a string [as key] is invalid, but it neither raises
an exception nor does it do the obvious and accept single-character
strings as keys.


Thoughts?

How could this raise an exception? You'd either need a typed dictionary (int
-->  unicode) or translate() would have to verify that all keys are indeed
integers.

The latter is exactly what I would have done, i.e. scan the dictionary for invalid values, in the spirit of not letting errors pass unnoticed.


The former would go against the grain of Python, the latter would
make the method less flexible as the set of keys currently need not be
predefined:

class A(object):
...     def __getitem__(self, key):
...             return unichr(key).upper()
...
u"alpha".translate(A())
u'ALPHA'

Working with __getitem__ is a point. I'm not sure if it is reasonable to expect this to work though. I'm -0 on that. I could also imagine a completely separate path for iterable and non-iterable mappings.


Using unicode instead of integer keys would be nice but breaks backwards
compatibility, using both could double the number of dictionary lookups.

Dictionary lookups are constant time and well-optimized, so I'd actually go for allowing both and paying that price. I could even imagine preprocessing the supplied dictionary while checking for invalid values. The result could be a structure that makes use of the fact that Unicode codepoints are < 22 bits and that makes the way from the elements of the source sequence to the according map entry as short as possible (I'm not sure if using codepoints or single-character strings is faster). However, those are early optimizations of which I'm not sure if they are worth it.

Anyway, thanks for your thoughts, they are always appreciated!

Uli

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to