unicode_literals和StringIO以及正确的做事方式

时间:2016-01-29 09:29:31

标签: python django python-2.7 unicode

是的,另一个漫无边际的问题。

我有一个代码段:

from __future__ import unicode_literals
import requests
from lxml import etree

class Review(object):
    def __init__(self, site_name):
        self.parser = etree.HTMLParser()
        # other things

     def get_root(self, url):
        # snip snip
        resp = requests.get(url)
        html = resp.text
        root = etree.parse(StringIO(html), self.parser)
        return root

有效。

在Python 3中,这将是:

from urllib import request
# stuff to detect encoding of page
response = request.urlopen(req)
html = response.read().decode(detected_encoding)
root = etree.parse(StringIO(self.html_doc), self.parser)

当页面声明的编码不是其实际编码时,需要处理很多丑陋的代码。

我的问题是unicode_literals对我来说基本上是伏都教,我对我的无知感到尴尬。为什么root = etree.parse(StringIO(html), self.parser)在导入unicode_literals的时候神奇地工作大多数,在python 2.7中做什么是正确的事情?

例如,我在我正在修复的一些Django代码中有这个构造:

stuff = StringIO(unicode(request.body))

这只是坏事和错误。但是我无法解释为什么它是坏的和错误的,除了说它打破的许多编码 utf-8

我得到的字符串是,python 3中的编码字符串,python 2.7中的ascii。我得到StringIO让我像处理缓冲区一样处理字符串。而且我知道stuff = StringIO(unicode(request.body)),对于导入unicode_literals会有点/有点合作,但我不知道为什么我不知道为什么不知道要做什么来避免编写大量丑陋的代码检测Django的request.body的编码,这就是我发布这个的原因。

TL;博士

python 2.7中的unicode_literals是什么,它会修复stuff = StringIO(unicode(request.body))中的Django错误,会有什么副作用?

非常感谢

1 个答案:

答案 0 :(得分:0)

unicode文字不会影响StringIO(unicode(request.body))之类的代码。它只是在Python 2中不使用前缀时更改文字字符串的类型。

没有unicode文字

u'y'  # unicode string
b'z'  # byte string
'x'  # byte string

使用unicode文字

from __future__ import unicode_literals
u'y'  # unicode string
b'z'  # byte string
'x'  # *unicode* string

使用unicode文字时,你的行为与Python 3.3+相同(你不能在Python 3.0到3.2中使用u''

request.body从字节字符串转换为unicode字符串的正确方法是在从字节字符串转换为unicode时指定编码。

stuff = StringIO(body.decode('utf-8'))

如果编码不是utf-8,则更改编码。