当前位置: 首页 > 面试题库 >

在Python 2.6中使用unicode_literals有任何陷阱吗?

公西飞鸾
2023-03-14
问题内容

我们已经获得了在Python 2.6下运行的代码库。为了准备Python 3.0,我们开始添加:

从__future__导入unicode_literals

进入我们的.py文件(我们对其进行修改)。我想知道是否还有其他人正在这样做并且遇到了任何非显而易见的陷阱(也许在花费大量时间进行调试之后)。


问题答案:

我处理unicode字符串的主要问题来源是将utf-8编码的字符串与unicode的字符串混合使用。

例如,考虑以下脚本。

py

# encoding: utf-8
name = 'helló wörld from two'

一个

# encoding: utf-8
from __future__ import unicode_literals
import two
name = 'helló wörld from one'
print name + two.name

运行的输出python one.py是:

Traceback (most recent call last):
  File "one.py", line 5, in <module>
    print name + two.name
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 4: ordinal not in range(128)

在此示例中,two.name是utf-8编码的字符串(不是unicode),因为它没有导入unicode_literals,并且one.name是unicode字符串。当您将两者混合使用时,python会尝试解码编码后的字符串(假设它是ascii)并将其转换为unicode并失败。如果您这样做的话,那会起作用的print name + two.name.decode('utf-8')

如果您对字符串进行编码并稍后尝试将其混合,则可能会发生相同的情况。例如,这有效:

# encoding: utf-8
html = '<html><body>helló wörld</body></html>'
if isinstance(html, unicode):
    html = html.encode('utf-8')
print 'DEBUG: %s' % html

输出:

DEBUG: <html><body>helló wörld</body></html>

但是添加后,import unicode_literals它不会:

# encoding: utf-8
from __future__ import unicode_literals
html = '<html><body>helló wörld</body></html>'
if isinstance(html, unicode):
    html = html.encode('utf-8')
print 'DEBUG: %s' % html

输出:

Traceback (most recent call last):
  File "test.py", line 6, in <module>
    print 'DEBUG: %s' % html
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 16: ordinal not in range(128)

它失败,因为'DEBUG: %s'是unicode字符串,因此python尝试解码html。修复打印件的几种方法正在执行print str('DEBUG: %s') % htmlprint 'DEBUG: %s' % html.decode('utf-8')

我希望这可以帮助您了解使用unicode字符串时的潜在陷阱。



 类似资料:
  • 这里归纳了Keras使用过程中的一些常见陷阱和解决方法,如果你的模型怎么调都搞不对,或许你有必要看看是不是掉进了哪个猎人的陷阱,成为了一只嗷嗷待宰(?)的猎物 Keras陷阱不多,我们保持更新,希望能做一个陷阱大全 内有恶犬,小心哟 TF卷积核与TH卷积核 Keras提供了两套后端,Theano和Tensorflow,这是一件幸福的事,就像手中拿着馒头,想蘸红糖蘸红糖,想蘸白糖蘸白糖 如果你从无到

  • 这里归纳了Keras使用过程中的一些常见陷阱和解决方法,如果你的模型怎么调都搞不对,或许你有必要看看是不是掉进了哪个猎人的陷阱,成为了一只嗷嗷待宰(?)的猎物 Keras陷阱不多,我们保持更新,希望能做一个陷阱大全 内有恶犬,小心哟 TF卷积核与TH卷积核 Keras提供了两套后端,Theano和Tensorflow,这是一件幸福的事,就像手中拿着馒头,想蘸红糖蘸红糖,想蘸白糖蘸白糖 如果你从无到

  • while (<STDIN>) 一定要小心这点。如果你不知怎么回事地得到了假值(如:空行),你的文件可能 停止处理了。假如你在处理文件读取(除非修改了 $/),这种事一般不会发生, 但却可能发生。 你更喜欢这样运行: while (readdir(DIR)) { 假设你有文件名为 0 的话,那么程序将停止,且不会继续处理文件。 更合适的 while 循环看起来像这样: while ( defin

  • 问题内容: 这是我正在考虑使用的模式: 通常,相对于dict get / set访问,我更喜欢对象属性访问的语义,但是在某些情况下,需要像dict一样的访问(例如),并且在这些情况下,我不希望使用特殊的gettersetter方法,因此,具有共享属性的dict和object同时具有双重行为。 是否有上述模式的陷阱? 问题答案: 这是达到相同效果的一种不太“ hacky”的方法: 我 认为 您的方法

  • 在绝大多数情况下, React都是清晰直观的. 但是也不乏有一些小陷阱, 不注意的话有时候也会给你”意外的惊喜”. 下面我们就来介绍一下这些小陷阱 参考资料 React Gotchas Top 5 React Gotchas

  • 通常,Python 旨在成为一门简洁一致的语言,避免发生意外。然而,有些情况可能会给新手们造成困惑。 在这些情况中,有一些虽是有意为之,但还是有潜在风险。还有一些则可以说是语言设计缺陷了。总之,下面列出的这些情况都是些乍一看很不好理解的行为,不过一旦您了解了这些奇怪行为背后的机理,也就基本上能理解了。 可变默认参数 似乎每个 Python 新手都会感到惊讶的一点是 Python 在函数定义中对待可