什么是python方式使用翻译以适用于str和unicode的方式?

时间:2015-03-08 09:41:39

标签: python string unicode unicode-string

我有一个清除特定字符串的函数:

def _clean_name(name):
    return name.translate(None, "\n ").replace('.', '_')

现在这个函数也必须支持unicode,所以我最终得到了这个版本:

def _clean_name(name):
    if type(name) is unicode:
        return name.translate({ord('\n'): None, ord(' '): None, ord('.'): ord('_')})
    else:
        return name.translate(None, "\n ").replace('.', '_')

但这对我来说并不太py。谁有更好的解决方案?

3 个答案:

答案 0 :(得分:1)

这可能是一种 hackish 方式,而不是Pythonic方式 - 但一个优点是它将删除代码重复,并且应该可以在unicode的子类上工作(你明确需要检查那个如果需要的话!)。

因此,利用类型对象可调用并且unicode和str都实现join操作:

def _clean_name(name):
    return type(name)().join(
#          ^^^^^^^^^^^^
#           build an empty str or unicode object
        [{'.': '_', '\n':'', ' ':''}.get(c,c) for c in name]
    )

答案 1 :(得分:0)

不幸的是translate字节字符串和Unicode字符串的语法不同,即使在Python 3中也是如此。有一种maketrans方法可以帮助构建转换表,但只有Python 3才有Unicode版本。我会为Python 2.x编写一个版本,但是否则使用您的方法版本来调用translate的正确版本:

import string

def unicode_maketrans(s,t,d=None):
    '''Generate a translation dictionary.
       Map ordinals in s to ordinals in t.
       Map ordinals in d to None.
    '''
    D = dict(zip(map(ord,s),map(ord,t)))
    if d:
        D.update({ord(c):None for c in d})
    return D

str_table = string.maketrans('.','_')
str_del = '\n '
uni_table = unicode_maketrans(u'.',u'_',u'\n ')

def clean_name(name):
    if isinstance(name,unicode):
        return name.translate(uni_table)
    else:
        return name.translate(str_table,str_del)

print repr(clean_name('this is.a test\n'))
print repr(clean_name(u'this is.a test\n'))

输出:

'thisis_atest'
u'thisis_atest'

答案 2 :(得分:0)

_clean_name 受保护,因此它的文件/类是本地的。我假设该课程适用于unicode字符串,或者进行清洁转换:

def _clean_name(name):
    if isinstance(name, str):
        name = unicode(str)
    return name.translate({ord('\n'): None, ord(' '): None, ord('.'): ord('_')})

是的,人们喜欢说Python的类型,但在你拥有的内部代码中,知道 name是一个unicode字符串是非常好的,而不是字节串。 Python 3甚至承认type('foo') == str是一个错误,你想要99%的时间使用unicode字符串文字,但是那么多遗留代码使用你通常必须支持它们的字节字符串。

相关问题