我有一个清除特定字符串的函数:
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。谁有更好的解决方案?
答案 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字符串文字,但是那么多遗留代码使用你通常必须支持它们的字节字符串。