UnicodeWarning 只触发一次
UnicodeWarning fired only once
考虑:
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 源代码级别的解释。
UnicodeWarning 的属性 'action' 似乎有 'once' 值:
https://docs.python.org/2/library/warnings.html#the-warnings-filter
Python 的默认配置是使用 default
warning configuration (with a few specific exceptions)。这意味着每个警告、模块和行只发出一次警告。
By default, each warning is printed once for each source line where it occurs.
如果在不同的模块或行号中出现相同的比较问题,将再次发出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:
我们得到了两行并且再次发出了警告。
考虑:
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 源代码级别的解释。
UnicodeWarning 的属性 'action' 似乎有 'once' 值:
https://docs.python.org/2/library/warnings.html#the-warnings-filter
Python 的默认配置是使用 default
warning configuration (with a few specific exceptions)。这意味着每个警告、模块和行只发出一次警告。
By default, each warning is printed once for each source line where it occurs.
如果在不同的模块或行号中出现相同的比较问题,将再次发出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:
我们得到了两行并且再次发出了警告。