ELMAH очень популярен и полезен для исключения, входящего в систему приложения ASP.NET.
Для Unicode-версии translate требуется отображение порядковых номеров Unicode (которые вы можете получить для одного символа с помощью ord
) в порядковые номера Unicode. Если вы хотите удалить символы, вы сопоставляете их с None
.
Я изменил вашу функцию, чтобы построить dict, сопоставляющий порядковый номер каждого символа с порядковым номером того, что вы хотите преобразовать:
def translate_non_alphanumerics(to_translate, translate_to=u'_'):
not_letters_or_digits = u'!"#%\'()*+,-./:;<=>?@[\]^_`{|}~'
translate_table = dict((ord(char), translate_to) for char in not_letters_or_digits)
return to_translate.translate(translate_table)
>>> translate_non_alphanumerics(u'<foo>!')
u'_foo__'
edit : Оказывается, отображение перевода должно отображаться из порядкового номера Unicode (через ord
) либо в другой порядковый номер Unicode, либо в строку Unicode, либо в None (для удаления). Таким образом, я изменил значение по умолчанию для translate_to
на литерал Unicode. Например:
>>> translate_non_alphanumerics(u'<foo>!', u'bad')
u'badfoobadbad'
Я придумал следующую комбинацию моей исходной функции и версии Майка , которая работает с Строки Unicode и ASCII:
def translate_non_alphanumerics(to_translate, translate_to=u'_'):
not_letters_or_digits = u'!"#%\'()*+,-./:;<=>?@[\]^_`{|}~'
if isinstance(to_translate, unicode):
translate_table = dict((ord(char), unicode(translate_to))
for char in not_letters_or_digits)
else:
assert isinstance(to_translate, str)
translate_table = string.maketrans(not_letters_or_digits,
translate_to
*len(not_letters_or_digits))
return to_translate.translate(translate_table)
Обновление : «принудительно» translate_to
к Unicode для Unicode translate_table
. Спасибо, Майк.
Для простого взлома, который будет работать как с объектами str, так и с объектами Unicode, преобразовать таблицу преобразования в Unicode перед запуском translate ():
import string
def translate_non_alphanumerics(to_translate, translate_to='_'):
not_letters_or_digits = u'!"#%\'()*+,-./:;<=>?@[\]^_`{|}~'
translate_table = string.maketrans(not_letters_or_digits,
translate_to
*len(not_letters_or_digits))
translate_table = translate_table.decode("latin-1")
return to_translate.translate(translate_table)
Уловка здесь в том, что она неявно преобразует все объекты str в unicode, выдает ошибки, если to_translate содержит символы, отличные от ascii.