Подтвердить что ты не робот

Python 3 - Encode/Decode vs Bytes/Str

Я новичок в python3, исходя из python2, и я немного запутался в принципах unicode. Я прочитал несколько хороших сообщений, что сделало все намного понятнее, однако я вижу, что на python 3 есть два метода, которые обрабатывают кодирование и декодирование, и я не уверен, какой из них использовать.

Итак, идея в python 3 состоит в том, что каждая строка является unicode и может быть закодирована и сохранена в байтах или снова декодирована в строку unicode.

Но есть два способа сделать это:
u'something'.encode('utf-8') будет генерировать b'bytes', но так же bytes(u'something', 'utf-8').
 И b'bytes'.decode('utf-8') похоже делает то же, что и str(b'', 'utf-8').

Теперь мой вопрос: почему существуют два метода, которые, похоже, делают одно и то же, и лучше, чем другие (и почему?), я пытался найти ответ на это в google, но не повезло.

>>> original = '27岁少妇生孩子后变老'
>>> type(original)
<class 'str'>
>>> encoded = original.encode('utf-8')
>>> print(encoded)
b'27\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x81'
>>> type(encoded)
<class 'bytes'>
>>> encoded2 = bytes(original, 'utf-8')
>>> print(encoded2)
b'27\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x81'
>>> type(encoded2)
<class 'bytes'>
>>> print(encoded+encoded2)
b'27\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x8127\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x81'
>>> decoded = encoded.decode('utf-8')
>>> print(decoded)
27岁少妇生孩子后变老
>>> decoded2 = str(encoded2, 'utf-8')
>>> print(decoded2)
27岁少妇生孩子后变老
>>> type(decoded)
<class 'str'>
>>> type(decoded2)
<class 'str'>
>>> print(str(b'27\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x81', 'utf-8'))
27岁少妇生孩子后变老
>>> print(b'27\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x81'.decode('utf-8'))
27岁少妇生孩子后变老
4b9b3361

Ответ 1

Ни то, ни другое лучше, они делают то же самое. Однако использование .encode() и .decode() - это более распространенный способ сделать это. Он также совместим с Python 2.

Ответ 2

Чтобы добавить к ответ Lennart Regebro Существует даже третий способ, который можно использовать:

encoded3 = str.encode(original, 'utf-8')
print(encoded3)

Во всяком случае, на самом деле это точно так же, как и первый подход. Также может показаться, что второй способ - синтаксический сахар для третьего подхода.


Язык программирования - это средство для формального выражения абстрактных идей, которое должно выполняться машиной. Язык программирования считается хорошим, если он содержит конструкции, которые вам нужны. Python - это гибридный язык, т.е. Более естественный и более универсальный, чем чистый OO или чистые процедурные языки. Иногда функции более подходят, чем методы объекта, иногда обратное верно. Это зависит от умственной картины решаемой проблемы.

В любом случае функция, упомянутая в вопросе, вероятно, является побочным продуктом реализации/дизайна языка. На мой взгляд, это хороший пример, который показывает альтернативное мышление о технически то же самое.

Другими словами, вызов метода объекта означает мышление в терминах "пусть объект дает мне желаемый результат". Вызов функции в качестве альтернативы означает "позволить внешнему коду обрабатывать переданный аргумент и извлекать требуемое значение".

Первый подход подчеркивает способность объекта выполнять задачу самостоятельно, второй подход подчеркивает способность отдельного алгоритма извлекать данные. Иногда отдельный код может быть настолько особенным, что нецелесообразно добавлять его в общий метод к классу объекта.

Ответ 3

Чтобы добавить к предыдущему ответу, существует даже четвертый способ, который можно использовать

import codecs
encoded4 = codecs.encode(original, 'utf-8')
print(encoded4)