2015-02-20 9 views
7

पर विचार करें:UnicodeWarning निकाल दिया केवल एक बार

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-स्रोत स्तर स्पष्टीकरण की सराहना करता हूं।

उत्तर

5

अजगर के लिए डिफ़ॉल्ट कॉन्फ़िगरेशन 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: जोड़कर हमें दो पंक्तियां मिलीं और चेतावनी फिर से उत्सर्जित हुई।

+0

धन्यवाद, यह बताता है। – georg

4

लगता है कि वहाँ 'एक बार' विशेषता के लिए मूल्य UnicodeWarning के लिए 'कार्रवाई':

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

+0

यह वास्तव में 'डिफ़ॉल्ट' है, न कि 'एक बार'। –

+0

आपका कौन सा मॉड्यूल मतलब है? –

+0

ओपी ने '__main__' मॉड्यूल में कोड चलाया (इंटरैक्टिव दुभाषिया में सभी कोड करता है)। अगर उन्होंने एक नया मॉड्यूल बनाया और एक ही समस्या को ट्रिगर किया, जिसके परिणामस्वरूप चेतावनी फिर से प्रदर्शित की जा रही है क्योंकि यह एक अलग मॉड्यूल में है। यदि उन्होंने उस मॉड्यूल में अलग-अलग लाइनों पर इस मुद्दे को ट्रिगर किया है, तो आपको उन पंक्तियों में से प्रत्येक के लिए चेतावनियां मिलेंगी। –

संबंधित मुद्दे