UnicodeWarning只触发一次

时间:2015-02-20 11:16:53

标签: python unicode internals

考虑:

Python 2.7.5 (default, Mar  9 2014, 22:15:05) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

>>> 'abc' == u'abc'
True

>>> 'ab\xDF' == u'abc'
__main__:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
False

>>> 'ab\xDF' == u'abc'
False

为什么没有第二次发出警告?我想这与实习有关,但无法弄清楚到底是什么。

我很欣赏cpython-source级解释。

2 个答案:

答案 0 :(得分:5)

Python的默认配置是使用default warning configuration(带few specific exceptions)。这意味着警告只发出一次每个警告,模块和行

请参阅-W arg command line switch

  

默认情况下,每个警告会针对出现的每个源行打印一次。

如果在不同的模块或行号中出现相同的比较问题,UnicodeWarning将再次发出。

在交互式解释器中,每次输入一些块,该块再次以行号1开头,并始终在__main__模块中执行。因此,第二次运行比较时,代码再次在__main__模块中作为第1行运行,因此警告被抑制。

如果您在其他模块或不同的行中触发了该问题,则会再次看到警告:

>>> 'ab\xDF' == u'abc'
__main__:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
False
>>> 'ab\xDF' == u'abc'
False
>>> if True:
...     'ab\xDF' == u'abc'
... 
__main__:2: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
False

第二次比较再次出现在第1行,因此警告被抑制,但在比较之前添加if True:我们得到了两行,并再次发出警告。

答案 1 :(得分:4)

似乎有一次'属性值' action'对于UnicodeWarning:

https://docs.python.org/2/library/warnings.html#the-warnings-filter