Используя фабрики или методы фабрики для всего создания объекта, можно избежать недопустимых объектов, не выдавая исключения от конструкторов. Метод создания должен возвратить нужный объект, если это в состоянии создать один, или пустой указатель, если это не. Вы теряете определенную гибкость в обработке ошибок конструкции в пользователе класса, потому что возврат пустого указателя не говорит Вам, что пошло не так, как надо в создании объекта. Но это также старается не добавлять сложность нескольких обработчиков исключений каждый раз, когда Вы запрашиваете объект и риск ловли исключений, которые Вы не должны обрабатывать.
string.maketrans
и string.translate
не работают для строк Unicode. Ваш вызов string.maketrans
неявно преобразует предоставленный вами Unicode в кодировку вроде utf-8
. В utf-8
å
занимает больше места, чем ASCII a
. string.maketrans
видит len (str (argument))
, который отличается для ваших двух строк.
Существует перевод Unicode, но для вашего случая использования (преобразование Unicode в ASCII поскольку какая-то часть вашей системы не может работать с Unicode), вам следует использовать http: // pypi. python.org/pypi/Unidecode . Unidecode очень умен в транслитерации символов Unicode в разумный ASCII, охватывающий гораздо больше символов, чем в вашем примере.
Вы должны сохранить свой код Python как utf-8, но убедитесь, что вы добавили магию, чтобы Python не предполагал вы использовали кодировку системы по умолчанию. Эта строка должна быть первой или второй строкой ваших файлов Python:
# -*- coding: utf-8 -*-
Обработка текста как Unicode вместо двоичных строк дает много преимуществ. Это способ Unicode для выполнения того, что вы пытаетесь сделать:
intab = u"ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ"
outtab = u"aaaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn"
trantab = dict((ord(a), b) for a, b in zip(intab, outtab))
translated = intab.translate(trantab)
translated == outtab # True
См. Также Где находится "лучшая база данных ASCII для этого Unicode" Python?
См. Также Как получить str.translate для работать со строками Unicode?
Возможно, вы могли бы использовать кодировку iso-8859-1 для вашего файла вместо utf-8
# -*- coding: iso-8859-1 -*-
from string import maketrans
import logging
intab = "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ"
outtab = "aaaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn"
logging.info(len(intab))
logging.info(len(outtab))
trantab = maketrans(intab, outtab)
Не забудьте выбрать iso-8859-1 в текстовом редакторе при сохранении этого исходного файла Python.