दिलचस्प पोस्ट
वास्तविक समय वेब अनुप्रयोगों के लिए शॉर्ट-पोलिंग लांग-वोटिंग बना रहा है? मैं कंट्रोलर से सिम्फनी 2 रन कमांड कैसे चला सकता हूं? ऑफ़लाइन होने पर OKHttp के साथ रेट्रोफ़िट कैश डेटा का उपयोग कर सकते हैं एएसपी.NET MVC 4 अनुमति कोड के साथ कस्टम ऑथराइज विशेषता (बिना भूमिकाओं) मैं .whl फ़ाइल के साथ एक पायथन पैकेज कैसे स्थापित करूं? एक अजाक्स कॉल के साथ फ़ंक्शन से वापसी मूल्य मॉड्यूलर अंकगणित और एनटीटी (परिमित क्षेत्र डीएफटी) अनुकूलन अन्य दृश्य मॉडल से मुख्य दृश्य मॉडल में फ़ंक्शन कैसे कॉल करें? मैं एक ListView में एक पंक्ति कैसे अपडेट कर सकता हूं? PHP में दो-तरफ़ा एन्क्रिप्शन क्लास का नाम दिए गए एक जार फ़ाइल ढूंढें? मैं एक नई सरणी के रूप में दो सरणियों के बीच का अंतर कैसे प्राप्त करूं? आप प्रोग्राम को एक HTML SELECT को ड्रॉप डाउन कैसे बता सकते हैं (उदाहरण के लिए, माउसओवर के कारण)? क्लाइंट साइड जावास्क्रिप्ट में Express.js स्थानीय चर तक पहुंच SQL में शून्य == नल प्राप्त करें

पायथन 2.6 में यूनिकोड_लिटरल्स का उपयोग करने वाला कोई मिला?

हमने पहले से ही पायथन 2.6 में अपना कोड बेस चलाया है। पायथन 3.0 के लिए तैयार करने के लिए, हमने जोड़ना शुरू कर दिया है:

 __future__ आयात यूनिकोड_ लिटरलों से

हमारे .py फ़ाइलों में (जैसा कि हम उन्हें संशोधित करते हैं)। मैं सोच रहा हूं कि कोई और ऐसा कर रहा है और किसी भी गैर-स्पष्ट मिलाकर (संभवतः बहुत समय तक डिबगिंग करने के बाद) में चला गया है।

वेब के समाधान से एकत्रित समाधान "पायथन 2.6 में यूनिकोड_लिटरल्स का उपयोग करने वाला कोई मिला?"

यूनिकोड स्ट्रिंग्स के साथ काम करने वाली समस्याओं का मुख्य स्रोत यह है कि जब आप यूनिकोड वाले यूटफ़ -8 एन्कोडेड स्ट्रिंग को मिलाते हैं

उदाहरण के लिए, निम्नलिखित स्क्रिप्ट पर विचार करें

two.py

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

one.py

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

एक python one.py चलने वाला 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 एक यूटीएफ -8 एन्कोडेड स्ट्रिंग है (यूनिकोड नहीं) क्योंकि यह unicode_literals आयात नहीं unicode_literals , और one.name एक यूनिकोड स्ट्रिंग है। जब आप दोनों मिश्रण करते हैं, तो अजैक्स एन्कोडेड स्ट्रिंग को डीकोड करने की कोशिश करता है (इसे एएससीआई मानते हुए) और इसे यूनिकोड में बदल दिया जाता है और विफल रहता है। यदि आप का print name + two.name.decode('utf-8') किया है तो यह काम करेगा 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' एक यूनिकोड स्ट्रिंग है और इसलिए अजगर html को डीकोड करने का प्रयास करता है प्रिंट को ठीक करने के कुछ तरीके या तो print str('DEBUG: %s') % html या print 'DEBUG: %s' % html.decode('utf-8')

मुझे उम्मीद है कि यह आपको यूनिकोड स्ट्रिंग्स का उपयोग करते समय संभावित गोट्स को समझने में सहायता करता है।

इसके अलावा 2.6 में (अजगर 2.6.5 आरसी 1 +) यूनिकोड लीटरल्स कीवर्ड के तर्कों के साथ अच्छा नहीं दिखता ( मुद्दा 4978 ):

उदाहरण के लिए निम्न कोड बिना यूनिकोड _ लिटरलों के काम करता है, लेकिन TypeError के साथ विफल रहता है: यदि यूनिकोड_लिटरल्स का उपयोग किया जाता है तो keywords must be string

  >>> def foo(a=None): pass ... >>> foo(**{'a':1}) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: foo() keywords must be strings 

मुझे पता चला कि अगर आप unicode_literals निर्देशों को जोड़ते हैं तो आपको कुछ भी जोड़ना चाहिए:

  # -*- coding: utf-8 

आपकी पहली या दूसरी पंक्ति को आपके .py फ़ाइल में अन्यथा लाइनों जैसे:

  foo = "barré" 

परिणामस्वरूप एक त्रुटि उत्पन्न होती है जैसे:

 सिंटेक्स त्रुटि: गैर-एएससीआईआई वर्ण '\ xc3' लाइन 198 पर फ़ाइल mumble.py में,
  लेकिन कोई एन्कोडिंग नहीं घोषित;  देखें http://www.python.org/peps/pep-0263.html 
  ब्योरा हेतु

यह भी ध्यान में unicode_literal कि unicode_literal eval() को प्रभावित करेगा लेकिन repr() (एक असममित व्यवहार जो imho एक बग है), अर्थात eval(repr(b'\xa4')) b'\xa4' बराबर नहीं होगा (जैसा कि यह पायथन 3 के साथ होगा)

आदर्श रूप से, निम्न कोड एक अपरिवर्तनीय होगा, जो सभी unicode_literals और पायथन {2.7, 3.x} के उपयोग के लिए हमेशा काम करना चाहिए:

 from __future__ import unicode_literals bstr = b'\xa4' assert eval(repr(bstr)) == bstr # fails in Python 2.7, holds in 3.1+ ustr = '\xa4' assert eval(repr(ustr)) == ustr # holds in Python 2.7 and 3.1+ 

दूसरा दावा काम करने के लिए होता है, क्योंकि repr('\xa4') मूल्यांकन करता u'\xa4' पायथन 2.7 में u'\xa4'

और भी हैं।

ऐसे लाइब्रेरी और बिल्टिन्स हैं जो तार की अपेक्षा करते हैं जो यूनिकोड को सहन नहीं करते हैं।

दो उदाहरण:

निर्मित:

 myenum = type('Enum', (), enum) 

(थोड़ा सा एस्कॉटिक) यूनिकोड_लिटरल्स के साथ काम नहीं करता है: प्रकार () एक स्ट्रिंग की अपेक्षा करते हैं

पुस्तकालय:

 from wx.lib.pubsub import pub pub.sendMessage("LOG MESSAGE", msg="no go for unicode literals") 

काम नहीं करता: wx pubsub लाइब्रेरी को एक स्ट्रिंग संदेश प्रकार की उम्मीद है।

पूर्व में गूढ़ और आसानी से तय है

 myenum = type(b'Enum', (), enum) 

लेकिन बाद वाला यह विनाशकारी है यदि आपका कोड pub.sendMessage () (जो मेरा है) के लिए कॉल से भरा है।

डांग, हे?!?