3 पॉइंट द्वारा GN⁺ 2024-04-28 | 1 टिप्पणियां | WhatsApp पर शेयर करें

PEP 686 - Python 3.15 से UTF-8 मोड डिफ़ॉल्ट रूप से सेट

  • UTF-8 व्यावहारिक रूप से मानक text encoding बनता जा रहा है
    • Python source files की डिफ़ॉल्ट encoding UTF-8 है
    • JSON, TOML, YAML UTF-8 का उपयोग करते हैं
    • Visual Studio Code, Windows Notepad आदि अधिकांश text editors डिफ़ॉल्ट रूप से UTF-8 का उपयोग करते हैं
    • अधिकांश websites और इंटरनेट पर मौजूद text data UTF-8 का उपयोग करते हैं
    • Node.js, Go, Rust, Java जैसी कई अन्य लोकप्रिय programming languages भी डिफ़ॉल्ट रूप से UTF-8 का उपयोग करती हैं
  • डिफ़ॉल्ट encoding को UTF-8 में बदलने से Python के लिए अन्य languages के साथ interoperable होना आसान हो जाता है
  • Unix का उपयोग करने वाले कई Python developers यह भूल जाते हैं कि डिफ़ॉल्ट encoding platform के अनुसार अलग होती है
    • UTF-8 में encoded text files (JSON, TOML, Markdown, Python source files आदि) पढ़ते समय वे encoding="utf-8" निर्दिष्ट नहीं करते
    • असंगत डिफ़ॉल्ट encodings के कारण कई bugs उत्पन्न होते हैं

PEP 686 में मुख्य बदलाव

  • Python 3.15 से UTF-8 मोड डिफ़ॉल्ट रूप से सक्षम रहेगा
    • उपयोगकर्ता अब भी PYTHONUTF8=0 या -X utf8=0 सेट करके UTF-8 मोड को अक्षम कर सकते हैं
  • locale.getencoding() जोड़ा गया
    • UTF-8 मोड की परवाह किए बिना locale encoding प्राप्त करने के लिए API
    • यदि warn_default_encoding विकल्प निर्दिष्ट है, तो locale.getpreferredencoding() भी open() की तरह EncodingWarning उत्पन्न करेगा (PEP 597 देखें)
  • encoding="locale" विकल्प में संशोधन
    • यदि encoding="locale" निर्दिष्ट है, तो TextIOWrapper को UTF-8 मोड में भी locale encoding का उपयोग करना चाहिए

Backward compatibility

  • अधिकांश Unix systems UTF-8 locale का उपयोग करते हैं और Python locale के C या POSIX होने पर UTF-8 मोड सक्षम करता है, इसलिए यह बदलाव मुख्यतः Windows users को प्रभावित करेगा
  • यदि Python program डिफ़ॉल्ट encoding पर निर्भर करता है, तो इस बदलाव से UnicodeError, mojibake, या बिना चेतावनी के data corruption हो सकता है
  • backward compatibility समस्याओं को हल करने के लिए दिशानिर्देश:
    1. UTF-8 मोड अक्षम करें
    2. EncodingWarning (PEP 597) का उपयोग करके उन सभी स्थानों को खोजें जिन पर UTF-8 मोड का प्रभाव पड़ता है
      • यदि encoding विकल्प छोड़ा गया है, तो encoding="utf-8" या encoding="locale" उपयोग करने पर विचार करें
      • यदि locale.getpreferredencoding() उपयोग किया जा रहा है, तो "utf-8" या locale.getencoding() उपयोग करने पर विचार करें
    3. application को UTF-8 मोड में test करें

GN⁺ की राय

  • यह PEP Python की डिफ़ॉल्ट encoding को UTF-8 में एकरूप बनाने का लक्ष्य रखता है ताकि अन्य languages और systems के साथ interoperability बढ़े। इससे Python को वैश्विक development environment में और अधिक सुचारु रूप से उपयोग करने में मदद मिलेगी
  • हालांकि, यह बदलाव मौजूदा Python programs की backward compatibility को प्रभावित कर सकता है। खासकर Windows environment में चलने वाले programs के लिए सावधानी आवश्यक है
  • developers को EncodingWarning का उपयोग करके प्रभावित हिस्सों की पहचान करनी चाहिए और encoding विकल्प को स्पष्ट रूप से निर्दिष्ट करने जैसे तरीकों से निपटना चाहिए
  • दीर्घकाल में इस बदलाव के Python ecosystem पर सकारात्मक प्रभाव पड़ने की उम्मीद है। हालांकि, अल्पकाल में कुछ projects में migration cost आ सकती है
  • developers को Python 3.15 में upgrade की योजना बनाते समय इस बदलाव पर विचार करना चाहिए और आवश्यकता पड़ने पर backward compatibility के लिए उचित कदम उठाने चाहिए

1 टिप्पणियां

 
GN⁺ 2024-04-28
Hacker News राय
  • Python की default text file encoding का platform के हिसाब से अलग होना लंबे समय से एक समस्या रही है
  • file system encoding की समस्या अलग है, और इस बदलाव में उसे शामिल नहीं किया गया है
  • system default पर निर्भर रहना अच्छा नहीं है, क्योंकि यह हमारी धारणा से अलग हो सकता है
  • पहले Ubuntu और init.d scripts में समस्या हुई थी। root के रूप में चलने वाली Java execution scripts सामान्य user से अलग encoding इस्तेमाल करती थीं, जिससे समस्या हुई
  • आजकल यह कम समस्या है, लेकिन इसे OS पर छोड़ने से बचना चाहिए। UTF-8 के अलावा किसी encoding का इस्तेमाल अक्सर अनजाने में होने की संभावना ज़्यादा है
  • बिना स्पष्ट रूप से specify किए OS settings पर निर्भर रहना अच्छा नहीं है
  • यह बदलाव सही दिशा में है। जो code टूटेगा, उसे बस आसानी से ठीक कर लेना बेहतर है
  • इसे content corruption bugs की संभावना वाली स्थिति में छोड़ने से यह बेहतर है

पिछले कई दशकों में धीरे-धीरे और अधिक सच साबित होता गया एक अनुभवजन्य नियम: "charset" setting अगर UTF-8 नहीं है, तो वह गलत है

  • Python 2 charset से बंधा नहीं था, इसलिए वह हमेशा अच्छी तरह काम करता था, लेकिन Python 3 का सुधार सिर्फ सुधार से भी बढ़कर था

  • Python 3 script और Python 2 script में फर्क करने का तरीका:

    • "utf-8" string हो तो Python 3
    • अगर सिर्फ C.UTF-8 locale में काम करे तो Python 3
  • यह बदलाव स्वागतयोग्य है, और लगता है कि यह Python 3 को और "बेहतर" बनाएगा

  • मुझे लगा था कि यह Python 3 से ही default था

Node.js, Go, Rust, Java सहित कई लोकप्रिय भाषाएँ default रूप से UTF-8 का इस्तेमाल करती हैं

  • मुझे नहीं पता था कि Java UTF-16 से UTF-8 पर चला गया है

  • मुझे नहीं पता कि CPython की internal encoding UTF-8 है या नहीं

  • Python strings को index किया जा सकता है, लेकिन random access कम ही होता है, इसलिए ज़रूरत पड़ने पर lazy indexing करना बेहतर लग सकता है

  • अगर सिर्फ एक-एक कदम आगे-पीछे जाना हो, तो index की ज़रूरत नहीं होती

  • इसलिए लगता है कि internal रूप से UTF-8 representation संभव हो सकती है

  • यह utf-8-sig क्यों नहीं है? BOM को optional रूप से handle करता है, इसलिए यह उपयोगी है

  • UTF-8 के संदर्भ में, Linux framebuffer में बहुत पहले से proper UTF-8 support होना चाहिए था

  • GNU Hurd के पास लगभग 2007 से UTF-8 support वाला एक बेहतर 'terminal console' था

  • अब 2024 में जाकर ऐसा बदलाव आ रहा है

  • अच्छा बदलाव है। अब बस JS को UTF-8 पर लाना बाकी है, लेकिन 1995 में लिखे गए code के साथ compatibility रखनी पड़ती है, इसलिए सुधार मुश्किल है

कई Unix Python developers यह भूल जाते हैं कि default encoding platform के अनुसार अलग होती है, और UTF-8 text files पढ़ते समय encoding="utf-8" को explicitly specify नहीं करते

  • "भूल जाते हैं" से ज़्यादा, शायद वे इसे ठीक से समझते ही नहीं
  • मुझे लगा था कि जब तक explicitly request न किया जाए, Python हर जगह सिर्फ UTF-8 ही इस्तेमाल करेगा