Как заставить __repr__ возвращать строку в юникоде - PullRequest
7 голосов
/ 17 февраля 2012

Я вызываю функцию __repr__() для объекта x следующим образом:

val = x.__repr__()

, а затем я хочу сохранить val строку в SQLite базе данных. Проблема в что val должен быть Unicode.

Я попробовал это безуспешно:

val = x.__repr__().encode("utf-8")

и

val = unicode(x.__repr__())

Вы знаете, как это исправить?

Я использую Python 2.7.2

Ответы [ 4 ]

15 голосов
/ 17 февраля 2012

Представление объекта не должно быть Unicode.Определите метод __unicode__ и передайте объект в unicode().

9 голосов
/ 17 февраля 2012

repr(x).decode("utf-8") и unicode(repr(x), "utf-8") должны работать.

1 голос
/ 30 октября 2017

В Python2 вы можете определить два метода:

#!/usr/bin/env python
# coding: utf-8

class Person(object):

    def __init__(self, name):

        self.name = name

    def __unicode__(self):
        return u"Person info <name={0}>".format(self.name)

    def __repr__(self):
        return self.__unicode__().encode('utf-8')


if __name__ == '__main__':
    A = Person(u"皮特")
    print A

В Python3 просто определите __repr__, все будет в порядке:

#!/usr/bin/env python
# coding: utf-8

class Person(object):

    def __init__(self, name):

        self.name = name

    def __repr__(self):
        return u"Person info <name={0}>".format(self.name)


if __name__ == '__main__':
    A = Person(u"皮特")
    print(A)
1 голос
/ 25 марта 2013

У меня была похожая проблема, потому что я вытаскивал текст из списка, используя repr.

b =['text\xe2\x84\xa2', 'text2']  ## \xe2\x84\xa2 is the TM symbol
a = repr(b[0])
c = unicode(a, "utf-8")
print c

>>> 
'text\xe2\x84\xa2'

Я, наконец, попытался соединиться, чтобы вывести текст из списка

b =['text\xe2\x84\xa2', 'text2']  ## \xe2\x84\xa2 is the TM symbol
a = ''.join(b[0])
c = unicode(a, "utf-8")
print c

>>> 
text™

Теперь это работает !!!!

Я пробовал несколько разных способов. Каждый раз, когда я использовал repr с функцией unicode, это не работало. Я должен использовать соединение или объявить текст, как в переменной е ниже.

b =['text\xe2\x84\xa2', 'text2']  ## \xe2\x84\xa2 is the TM symbol
a = ''.join(b[0])
c = unicode(repr(a), "utf-8")
d = repr(a).decode("utf-8")
e = "text\xe2\x84\xa2"
f = unicode(e, "utf-8")
g = unicode(repr(e), "utf-8")
h = repr(e).decode("utf-8")
i = unicode(a, "utf-8")
j = unicode(''.join(e), "utf-8")
print c
print d
print e
print f
print g
print h
print i
print j

*** Remote Interpreter Reinitialized  ***
>>> 
'text\xe2\x84\xa2'
'text\xe2\x84\xa2'
textâ„¢
text™
'text\xe2\x84\xa2'
'text\xe2\x84\xa2'
text™
text™
>>> 

Надеюсь, это поможет.

...