Я писал setup.py для пакета Python, используя setuptools, и хотел включить не-ASCII-символ в поле long_description:
#!/usr/bin/env python
from setuptools import setup
setup(...
long_description=u"...", # in real code this value is read from a text file
...)
К сожалению, передача объекта Unicode в setup () прерывает любую из следующих двух команд с помощью UnicodeEncodeError
python setup.py --long-description | rst2html
python setup.py upload
Если я использую необработанную строку UTF-8 для поля long_description, то следующая команда разрывается с UnicodeDecodeError:
python setup.py register
Я обычно выпускаю программное обеспечение, запуская 'python setup.py sdist register upload', что означает, что уродливые хаки, которые смотрят в sys.argv и передают нужный тип объекта, прямо сейчас.
В конце концов я сдался и реализовал другой уродливый хак:
class UltraMagicString(object):
# Catch-22:
# - if I return Unicode, python setup.py --long-description as well
# as python setup.py upload fail with a UnicodeEncodeError
# - if I return UTF-8 string, python setup.py sdist register
# fails with an UnicodeDecodeError
def __init__(self, value):
self.value = value
def __str__(self):
return self.value
def __unicode__(self):
return self.value.decode('UTF-8')
def __add__(self, other):
return UltraMagicString(self.value + str(other))
def split(self, *args, **kw):
return self.value.split(*args, **kw)
...
setup(...
long_description=UltraMagicString("..."),
...)
Разве нет лучшего способа?