string.maketrans unicode 处理:pypy 与 CPython

string.maketrans unicode handling: pypy vs CPython

当参数是 unicode 时,Pypy 似乎无法处理 string.maketrans(),但 CPython 可以:

$ python
Python 2.7.5 (default, Oct 11 2013, 14:51:32)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import string
>>> string.maketrans(ur"-/[] ", ur"_____")
'\x00\x01\x02\x03\x04\x05\x06...'
$ pypy
Python 2.7.13 (c925e73810367cd960a32592dd7f728f436c125c, Jun 08 2017, 19:14:08)
[PyPy 5.8.0 with GCC 6.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>> import string
>>>> string.maketrans(ur"-/[] ", ur"_____")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File ".../pypy-5.8-linux_x86_64-portable/lib-python/2.7/string.py", line 78, in maketrans
    buf[ord(fromstr[i])] = tostr[i]
TypeError: 'unicode' object cannot be interpreted as an index

未在 http://pypy.readthedocs.io/en/latest/cpython_differences.html 上找到任何相关内容。

这是 CPython 或 PyPy 的错误吗?

那是 "bug",即意想不到的差异。已在 7fe0041fccaa 中修复(参见 https://bitbucket.org/pypy/pypy/raw/default/lib-python/2.7/string.py 的第 78 行)。