В чем разница между этими кодами и что делает repr? - PullRequest
3 голосов
/ 18 января 2010

1.

>>> s = u"4-12\u4e2a\u82f1\u6587\u5b57\u6bcd\u3001\u6570\u5b57\u548c\u4e0b\u5212\u7ebf"
>>> print s
4-12个英文字母、数字和下划线
>>> print repr(s)
u'4-12\u4e2a\u82f1\u6587\u5b57\u6bcd\u3001\u6570\u5b57\u548c\u4e0b\u5212\u7ebf'

2

print repr("4-12个英文字母、数字和下划线")
'4-12\xb8\xf6\xd3\xa2\xce\xc4\xd7\xd6\xc4\xb8\xa1\xa2\xca\xfd\xd7\xd6\xba\xcd\xcf\xc2\xbb\xae\xcf\xdf'

1 и 2 различны, но исходная строка одинакова, оба '4-12 个 英文 字母 、 数字 和 下划线'

что именно делает repr?

то же значение:

>>> print '4-12个英文字母、数字和下划线'.decode('gb2312').encode('unicode-escape')
4-12\u4e2a\u82f1\u6587\u5b57\u6bcd\u3001\u6570\u5b57\u548c\u4e0b\u5212\u7ebf

Ответы [ 4 ]

2 голосов
/ 18 января 2010

Я возьму удар в этом, 'repr' - машинное представление объекта, в то время как 'print' показывает удобочитаемое представление объекта.Есть встроенные методы ' repr ', ' str ' и ' unicode ', которые могут использоваться программистами для реализации различных печатаемых представлений объекта,Вот простой пример

class PrintObject(object):
    def __repr__(self):
        return 'repr'

    def __str__(self):
        return 'str'

    def __unicode__(self):
        return 'unicode'

Теперь, если вы загрузите этот объект в оболочку Python и поэкспериментируете с ним, вы увидите, как эти разные методы используются для представления печатного представления объекта

Python 2.6.4 (r264:75821M, Oct 27 2009, 19:48:32)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from printobject import PrintObject
>>> printObj = PrintObject()
>>> printObj
>>> repr(printObj)
'repr'
>>> str(printObj)
'str'
>>> unicode(printObj)
u'unicode'

Метод ' repr ' используется, если вы просто набираете экземпляр и возвращаете

>>> printObj
repr

Метод ' str ' используется, если выиспользуйте print для экземпляра

>>> print(printObj)
str

, а метод ' unicode ' используется, если вы используете экземпляр в строке Unicode.

>>> print(u'%s' % printObj)
unicode

Когда и есливы начинаете писать свои собственные классы, эти методы очень пригодятся.

1 голос
/ 18 января 2010

В первом случае интерпретатор Python автоматически декодировал байты, переданные ему в символах кодировкой терминала, поскольку он является литералом Unicode. Печать repr() этого дает escape-последовательности Unicode.

Во втором случае декодирование не выполняется, поскольку он является литералом str, и поэтому его repr() состоит из escape-последовательностей байтов, соответствующих символам в кодировке терминала (в данном случае, GB2312).

1 голос
/ 18 января 2010

В первом случае вы получаете repr объекта Unicode. Концептуально это серия символов Unicode, и repr дает вам последовательность кодов Unicode для этих символов в качестве escape-последовательности. то есть «\ u4e2a» - это кодовая точка 20010 (0x4e2a - шестнадцатеричное представление), которая отображается как «个».

Во втором случае вы получаете repr строкового объекта. Строки, по сути, представляют собой последовательности 8-битных значений, не имеющие внутренних знаний о том, как эти значения относятся к символам. Когда вы печатаете или вводите эти символы в командной строке, они интерпретируются с использованием кодировки по умолчанию вашей системы. Когда вы печатаете repr объекта, вы видите необработанные байты, из которых он состоит - печатаемые символы ASCII печатаются как есть, все остальное отображается как escape-последовательность (т. Е. \ Xb8 - это значение 184 (записано 0xB8 в шестнадцатеричном формате) ). В кодировке вашей системы (gb2312) последовательность байтов [184, 246] ('\ xb8 \ xf6') соответствует кодовой точке Юникода 0x4e2a. Однако строка не знает, в какой кодировке она находится, или даже в том, что представляет последовательность символов, поэтому repr просто дает вам необработанные базовые данные. Чтобы преобразовать его в объект Unicode, вам необходимо декодировать его из этих данных, указав, как следует интерпретировать необработанные данные:

>>> s=s.decode('gb2312')

В python3 это различие между «символами» и «данными» сделано несколько более четким, поскольку объект str переименовывается в «байты», и то, что теперь является строками юникода, становится просто строками.

1 голос
/ 18 января 2010

Относительно репр

>>> help(repr)
Help on built-in function repr in module __builtin__:

repr(...)
    repr(object) -> string

    Return the canonical string representation of the object.
    For most object types, eval(repr(object)) == object.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...