2009-11-14 14 views
18

मैं कुछ कोड पर काम कर रहा हूं जिसे यूनिकोड तारों में हेरफेर करना है। मैं इसके लिए सिद्धांत लिखने की कोशिश कर रहा हूं, लेकिन मुझे परेशानी हो रही है।मैं पाइथन सिद्धांतों में यूनिकोड तारों को कैसे शामिल करूं?

# -*- coding: utf-8 -*- 
def mylen(word): 
    """ 
    >>> mylen(u"áéíóú") 
    5 
    """ 
    return len(word) 

print mylen(u"áéíóú") 

पहले हम print mylen(u"áéíóú") की उम्मीद उत्पादन को देखने के लिए कोड चलाएँ: निम्नलिखित एक न्यूनतम उदाहरण है कि समस्या को दिखाता है।

$ python mylen.py 
5 

अगला, हम समस्या को देखने के लिए सबसे कठिन चलते हैं।

$ python -m 
5 
********************************************************************** 
File "mylen.py", line 4, in mylen.mylen 
Failed example: 
    mylen(u"áéíóú") 
Expected: 
    5 
Got: 
    10 
********************************************************************** 
1 items had failures: 
    1 of 1 in mylen.mylen 
***Test Failed*** 1 failures. 

मैं कैसे तो परीक्षण कर सकते हैं कि mylen(u"áéíóú") 5 का मूल्यांकन?

उत्तर

18

आप यूनिकोड तार चाहते हैं, आप यूनिकोड docstrings उपयोग करने के लिए है! u पर ध्यान दें!

# -*- coding: utf-8 -*- 
def mylen(word): 
    u"""  <----- SEE 'u' HERE 
    >>> mylen(u"áéíóú") 
    5 
    """ 
    return len(word) 

print mylen(u"áéíóú") 

यह काम करेगा - जब तक परीक्षण पास हो जाएंगे। अजगर 2.x के लिए आप वर्बोज़ doctest मोड काम करने या सही ट्रेस बैक प्राप्त करने के लिए जब परीक्षण असफल अभी तक एक और हैक की जरूरत है:

if __name__ == "__main__": 
    import sys 
    reload(sys) 
    sys.setdefaultencoding("UTF-8") 
    import doctest 
    doctest.testmod() 

एनबी! डीबग उद्देश्यों के लिए केवल setdefaultencoding का उपयोग करें। मैं इसे सबसे अच्छे उपयोग के लिए स्वीकार करता हूं, लेकिन आपके उत्पादन कोड में कहीं भी नहीं।

+0

धन्यवाद! यह दृष्टिकोण किसी भी पैकेज के साथ काम नहीं करेगा जो पाइथन 2.x पर परीक्षणों को स्वतः खोजता है। – saffsd

2

यह पाइथन में एक ज्ञात और अभी तक अनसुलझा मुद्दा प्रतीत होता है। खुले मुद्दे here और here देखें।

नहीं आश्चर्य की बात है, यह अजगर 3 में ठीक काम करने के लिए संशोधित किया जा सकता के बाद से सभी तार यूनिकोड देखते हैं:

def mylen(word): 
    """ 
    >>> mylen("áéíóú") 
    5 
    """ 
    return len(word) 

print(mylen("áéíóú")) 
+0

पर्याप्त मेला, यह शायद बेहतर सामान्य समाधान है करने के लिए अगले। हालांकि, मेरे मामले में मैं अभी भी matthotlib और numpy पर निर्भरताओं के कारण Python 2.x के लिए बाध्य हूँ। – saffsd

1

मेरा समाधान यूनिकोड वर्णों से बचने के लिए था, जैसे कि आप '\ xe1 \ xe9 \ xed \ xf3 \ xfa'। हालांकि पढ़ने के लिए आसान नहीं था, लेकिन मेरे परीक्षणों में केवल कुछ गैर-ASCII वर्ण थे, इसलिए उन मामलों में मैंने विवरण को एक टिप्पणी के रूप में रखा, जैसे "# n tilde"।

+0

धन्यवाद! दुर्भाग्य से यह दृष्टिकोण स्फिंक्स के साथ 'मेकटेक्ट' बना देता है। यह एक 'utf8' कोडेक के साथ समाप्त होता है स्थिति में बाइट डीकोड नहीं कर सकता ...: अमान्य डेटा। – saffsd

+0

हम्म। खैर, मैं इसे अपने स्वयं के सिद्धांतों के लिए उपयोग कर रहा हूं। क्षमा करें, लेकिन मुझे नहीं पता कि यहां क्या हो रहा है। –

5

अजगर 2.6.6 यूनिकोड उत्पादन बहुत अच्छी तरह से समझ में नहीं आता है, लेकिन इस का उपयोग कर ठीक किया जा सकता:

  • sys.setdefaultencoding("UTF-8")
  • यूनिकोड docstring (पहले से ही बहुत ऊपर उल्लेख किया है, बहुत बहुत शुक्रिया) के साथ पहले से ही वर्णित हैक
  • और print कथन।

मेरे मामले में यह docstring कि परीक्षण बताता है टूट गया है:

def beatiful_units(*units): 
    u'''Returns nice string like 'erg/(cm² sec)'. 

    >>> beatiful_units(('erg', 1), ('cm', -2), ('sec', -1)) 
    u'erg/(cm² sec)' 
    ''' 

print का उपयोग करना है कि हम ठीक कर सकते हैं के साथ "त्रुटि" संदेश

Failed example: 
    beatiful_units(('erg', 1), ('cm', -2), ('sec', -1)) 
Expected: 
    u'erg/(cm² sec)' 
Got: 
    u'erg/(cm\xb2 sec)' 

:

def beatiful_units(*units): 
    u'''Returns nice string like 'erg/(cm² sec)'. 

    >>> print beatiful_units(('erg', 1), ('cm', -2), ('sec', -1)) 
    erg/(cm² sec) 
    ''' 
+0

'print' के साथ अंतिम फिक्स मेरे दिन को बचाया, धन्यवाद! –

1

जैसा कि पहले से ही उल्लेख किया गया है, आपको अपने डॉक्टर को सुनिश्चित करने की आवश्यकता है छल्ले यूनिकोड हैं।

यदि आप पाइथन 3 पर स्विच कर सकते हैं, तो यह दोनों स्रोत एन्कोडिंग पहले से ही utf-8 है और डिफ़ॉल्ट स्ट्रिंग प्रकार यूनिकोड है।

अजगर 2 पर एक ही लक्ष्य को हासिल करने के लिए आप रखने की जरूरत है coding: utf-8 जो आप या तो u के साथ सभी docstrings उपसर्ग कर सकते हैं, या बस जोड़ने

from __future__ import unicode_literals 
संबंधित मुद्दे