python2 और python3 के सिंटैक्स में अंतर और बदलाव
लगभग सभी पायथन 2 प्रोग्रामों को पायथन 3 के वातावरण में ठीक से चलाने के लिए कुछ संशोधनों की आवश्यकता होती है। इस रूपांतरण प्रक्रिया को सरल बनाने के लिए, पायथन 3 एक 2 से 3 उपयोगिता स्क्रिप्ट के साथ आता है, जिसे यूटिलिटी स्क्रिप्ट कहा जाता है, जो आपके पायथन 2 प्रोग्राम की स्रोत फ़ाइल को इनपुट के रूप में लेता है और फिर इसे स्वचालित रूप से पायथन 3 में बदल देता है। केस स्टडीः पोर्टिंग चार्डट टू पायथन 3 इस स्क्रिप्ट को कैसे चलाया जाए, इसके बारे में बताता है, और फिर कुछ स्थितियों को दिखाता है जहां इसे स्वचालित रूप से ठीक नहीं किया जा सकता है। यह अनुलग्नक बताता है कि यह स्वचालित रूप से क्या ठीक कर सकता है।
पायथन 2 में, print एक वाक्य है। आप जो कुछ भी आउटपुट करना चाहते हैं, बस उन्हें प्रिंट कीवर्ड के बाद रखें। पायथन 3 में, print () एक फ़ंक्शन है। अन्य फ़ंक्शंस की तरह, print () आपको उस चीज़ को पैरामीटर के रूप में पास करने की आवश्यकता है जिसे आप आउटपुट करना चाहते हैं।
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | print() | |
| ② | print 1 | print(1) |
| ③ | print 1,2 | print(1,2) |
| ④ | print 1,2, | print(1,2,end=' ') |
| ⑤ | print >>sys.stderr,1,2,3 | print(1,2,3, file=sys.stderr) |
1। एक खाली पंक्ति को आउटपुट करने के लिए, बिना पैरामीटर के print () को कॉल करने की आवश्यकता है।
2। एक अलग मान को आउटपुट करने के लिए, एक पैरामीटर को प्रिंट () के रूप में रखना आवश्यक है।
3। आउटपुट के लिए एक रिक्त स्थान से अलग दो मानों का उपयोग करें, दो मापदंडों के साथ कॉल करें print (()) ।
4। इस उदाहरण में कुछ चालें हैं। पायथन 2 में, यदि आप print वाक्य के अंत में एक अल्पविराम ((,) का उपयोग करते हैं, तो यह आउटपुट को एक रिक्त स्थान के साथ अलग कर देगा, और फिर एक अनुवर्ती रिक्त स्थान ((trailing space) का उत्पादन करेगा, बिना carriage return () का उत्पादन किया। पायथन 3 में, एक ही प्रभाव को end=' 'के रूप में एक कीवर्ड पैरामीटर के रूप में print पर पारित करके प्राप्त किया जा सकता है। पैरामीटर पैरामीटर का डिफ़ॉल्ट मान '\n' है, इसलिए अंत में आउटपुट कार्ट को समाप्त करने के लिए पैरामीटर पैरामीटर को फिर से निर्दिष्ट करके समाप्त किया जा सकता है।
5. पायथन 2 में, आप एक पाइपलाइन में आउटपुट को पुनर्निर्देशित कर सकते हैं, उदाहरण के लिए, sys.stderr के लिए >>pipe_name सिंटैक्स का उपयोग करके। पायथन 3 में, आप पाइपलाइन को प्रिंट () को पास करके एक ही कार्य कर सकते हैं। पैरामीटर फ़ाइल का डिफ़ॉल्ट मान std.stdout है, इसलिए इसका पुनः निर्दिष्ट करने से प्रिंट () एक और पाइपलाइन में आउटपुट करेगा।
पायथन 2 में दो प्रकार के स्ट्रिंग प्रकार हैंःयूनिकोड स्ट्रिंगऔरगैर यूनिकोड स्ट्रिंगपायथन 3 में केवल एक प्रकार हैःयूनिकोड स्ट्रिंग्स。
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | u'PapayaWhip' | 'PapayaWhip' |
| ② | ur'PapayaWhip\foo' | r'PapayaWhip\foo' |
पायथन 2 में यूनिकोड स्ट्रिंग्स पायथन 3 में सामान्य स्ट्रिंग्स हैं, क्योंकि पायथन 3 में स्ट्रिंग्स हमेशा यूनिकोड के रूप में होती हैं।
यूनिकोड मूल स्ट्रिंग ((raw string) ((इस तरह की स्ट्रिंग का उपयोग करते हुए, पायथन स्वचालित रूप से उलटा तिरछा नहीं करता है"") को सामान्य स्ट्रिंग के रूप में भी बदल दिया गया है, क्योंकि पायथन 3 में, सभी मूल स्ट्रिंग्स यूनिकोड में एन्कोड की जाती हैं।
पायथन 2 में दो वैश्विक फ़ंक्शंस हैं जो ऑब्जेक्ट्स को स्ट्रिंग्स में परिवर्तित करने के लिए मजबूर करते हैंः यूनिकोड ((() ऑब्जेक्ट्स को यूनिकोड स्ट्रिंग्स में परिवर्तित करता है, और str ((() ऑब्जेक्ट्स को गैर-यूनिकोड स्ट्रिंग्स में परिवर्तित करता है। पायथन 3 में केवल एक स्ट्रिंग प्रकार है, यूनिकोड स्ट्रिंग्स, इसलिए str ((() फ़ंक्शन सभी कार्यों को पूरा करता है।unicode() फ़ंक्शन अब पायथन 3 में मौजूद नहीं है <unk>)
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | unicode(anything) | str(anything) |
पायथन 2 में गैर-फ्लोटिंग संख्याओं के लिए तैयार int और long प्रकार हैं। int प्रकार का अधिकतम मूल्य sys.maxint से अधिक नहीं हो सकता है, और यह अधिकतम मूल्य प्लेटफ़ॉर्म से संबंधित है। लंबे पूर्णांक को संख्या के अंत में एक L जोड़कर परिभाषित किया जा सकता है, जो स्पष्ट रूप से, int प्रकार द्वारा दर्शाए गए संख्याओं की तुलना में अधिक है। पायथन 3 में, केवल एक पूर्णांक प्रकार int है, जो ज्यादातर मामलों में, पायथन 2 में लंबे पूर्णांक की तरह है। चूंकि दो प्रकार के पूर्णांक मौजूद नहीं हैं, इसलिए उन्हें अलग करने के लिए विशेष सिंटैक्स का उपयोग करने की आवश्यकता नहीं है।
आगे की पढाई: पीईपी २३७ः एकजुटता और एकजुटता
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | x = 1000000000000L | x = 1000000000000 |
| ② | x = 0xFFFFFFFFFFFFL | x = 0xFFFFFFFFFFFF |
| ③ | long(x) | int(x) |
| ④ | type(x) is long | type(x) is int |
| ⑤ | isinstance(x,long) | isinstance(x,int) |
पायथन 2 में दशमलव दीर्घ पूर्णांक को पायथन 3 में दशमलव पूर्ण पूर्णांक के रूप में प्रतिस्थापित किया गया है।
पायथन 2 में सोलह अंकों का लंबा पूर्णांक पायथन 3 में सोलह अंकों का सामान्य पूर्णांक के रूप में प्रतिस्थापित किया गया है।
Python 3 में, क्योंकि लंबे पूर्णांक प्रकार अब मौजूद नहीं हैं,प्राकृतिक मूल long () फ़ंक्शन भी नहीं है. एक चर को एक पूर्णांक में बदलने के लिए, int () फ़ंक्शन का उपयोग किया जा सकता है。
जांचें कि क्या एक चर एक पूर्णांक है, इसका डेटा प्रकार प्राप्त करें, और इसकी तुलना int प्रकार के साथ करें (long नहीं) ।
डेटा प्रकार की जांच करने के लिए आप inisinstance () फ़ंक्शन का उपयोग कर सकते हैं; एक बार फिर, int का उपयोग करें, न कि long का, पूर्णांक प्रकार की जांच करने के लिए।
पायथन 2 समर्थन <> के रूप में! = का पर्यायवाची. पायथन 3 केवल! = का समर्थन करता है, अब <> का समर्थन नहीं करता है।
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | if x <> y: | if x != y: |
| ② | if x <> y<> z: | if x != y!= z: |
- सरल तुलना
- तीन अपेक्षाकृत जटिल मानों के बीच तुलना।
पायथन 2 में, शब्दकोश ऑब्जेक्ट का has_key() विधि का उपयोग करने के लिए परीक्षण करने के लिए कि शब्दकोश में एक विशेष कुंजी है या नहीं))) पायथन 3 अब इस विधि का समर्थन नहीं करता))) आपको उपयोग करने की आवश्यकता हैinऑपरेटर
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | a_dictionary.has_key('PapayaWhip') | 'PapayaWhip' in a_dictionary |
| ② | a_dictionary.has_key(x) or a_dictionary.has_key(y) | x in a_dictionary or y in a_dictionary |
| ③ | a_dictionary.has_key(x or y) | (x or y) in a_dictionary |
| ④ | a_dictionary.has_key(x + y) | (x + y) in a_dictionary |
| ⑤ | x + a_dictionary.has_key(y) | x + (y in a_dictionary) |
- सबसे सरल रूप <unk>
2। ऑपरेटर or की प्राथमिकता ऑपरेटर in से कम है, इसलिए यहां कोष्ठक जोड़ने की आवश्यकता नहीं है।
3। दूसरी ओर, उसी कारण से, or को in से कम प्राथमिकता दी जाती है, और यहां कोष्ठक जोड़ने की आवश्यकता होती है। ध्यान देंः यहां कोड पिछले पंक्ति से पूरी तरह से अलग है। पायथन पहले x या y को व्याख्या करेगा, परिणाम प्राप्त करेगा x ((यदि x बुल पर संदर्भ में सही है) या y। फिर पायथन जांचता है कि क्या परिणाम a है_dictionary की एक कुंजी <unk>)
4। ऑपरेटर in की प्राथमिकता ऑपरेटर + से कम है, इसलिए कोड में इस रूप को तकनीकी रूप से कोष्ठक की आवश्यकता नहीं है, लेकिन 2to3 जोड़ा गया है। - इस प्रकार के प्रारूप को कोष्ठक की आवश्यकता होती है, क्योंकि in की प्राथमिकता + <unk> से कम है
पायथन 2 में, कई शब्दकोश विधियों के लिए लौटाए गए मान सूची हैं। इनमें से सबसे अधिक उपयोग की जाने वाली विधियों में कुंजी, आइटम और मान हैं। पायथन 3 में, उपरोक्त सभी विधियों के लिए लौटाए गए मानों को गतिशील दृश्य में बदल दिया गया है। कुछ संदर्भों में, इस परिवर्तन का कोई प्रभाव नहीं पड़ता है। यदि इन विधियों के लिए लौटाए गए मान तुरंत किसी अन्य फ़ंक्शन को दिए जाते हैं, और वह फ़ंक्शन पूरे अनुक्रम में चलता है, तो उपरोक्त विधियों के लिए लौटाए गए मान सूची या दृश्य हैं और इससे कोई फर्क नहीं पड़ता है। अन्य मामलों में, पायथन 3 में ये परिवर्तन महत्वपूर्ण हैं। यदि आप एक सूची की उम्मीद करते हैं जो तत्वों को स्वतंत्र रूप से पता लगाया जा सकता है, तो पायथन 3 में ये परिवर्तन आपके कोड कार्ड को रोक देंगे, क्योंकि दृश्य अनुक्रमण का समर्थन नहीं करता है।
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | a_dictionary.keys() | list(a_dictionary.keys()) |
| ② | a_dictionary.items() | list(a_dictionary.items()) |
| ③ | a_dictionary.iterkeys() | iter(a_dictionary.keys()) |
| ④ | [i for iin a_dictionary.iterkeys()] | [i for iin a_dictionary.keys()] |
| ⑤ | min(a_dictionary.keys()) | no change |
1 ⇒ list () फ़ंक्शन का उपयोग करके keys () के रिटर्न को एक स्थिर सूची में परिवर्तित किया जाता है, सुरक्षा के लिए, 2to3 त्रुटि रिपोर्ट कर सकता है ⇒ ऐसा कोड प्रभावी है, लेकिन यह दृश्य का उपयोग करने के लिए कम कुशल है ⇒ आपको यह देखने के लिए रूपांतरण के बाद कोड की जांच करनी चाहिए कि क्या आपको निश्चित रूप से सूची की आवश्यकता है, शायद दृश्य भी ऐसा ही काम कर सकता है ⇒
2. यह एक और दृश्य है ([items] विधि के बारे में) सूची में रूपांतरण △ 2to3 पर values () विधि में लौटाए गए मानों का रूपांतरण भी समान है △
3। पाइथन 3 में अब iterkeys को समर्थन नहीं दिया गया है। यदि आवश्यक हो, तो iter () का उपयोग करके keys () के रिटर्न को एक iterator में परिवर्तित करें।
4, 2to3 यह पहचानने में सक्षम है कि iterkeys () विधि का उपयोग सूची विश्लेषण में किया जाता है, और फिर इसे पायथन 3 में keys () विधि में परिवर्तित किया जाता है। इसके लिए अतिरिक्त iter () का उपयोग करने की आवश्यकता नहीं होती है ताकि इसके रिटर्न को पैक किया जा सके। यह संभव है क्योंकि दृश्य पुनरावर्ती है।
5 2to3 यह भी पहचानता है कि keys (()) विधि का रिटर्न तुरंत एक और फ़ंक्शन को दिया जाता है जो पूरे अनुक्रम को पार करता है, इसलिए पहले keys (()) के रिटर्न को एक सूची में बदलने की आवश्यकता नहीं है। इसके विपरीत, min ((() फ़ंक्शन दृश्य को पार करने के लिए खुश होगा। यह प्रक्रिया min (((), max (((), sum (((), list (((), tuple (((), set (((), sorted (((), any ((() और all (()) के लिए भी प्रभावी है।
पायथन 2 से पायथन 3 तक, मानक कुरी में कुछ मॉड्यूल का नाम बदल दिया गया है। कुछ अन्य संबंधित मॉड्यूल को गठबंधन या पुनर्गठित किया गया है ताकि यह संबंध अधिक तार्किक हो सके।
- http
पायथन 3 में, कई संबंधित एचटीटीपी मॉड्यूल एक अलग पैकेज में गठित किए गए हैं, http <unk>
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | import httplib | import http.client |
| ② | import Cookie | import http.cookies |
| ③ | import cookielib | import http.cookiejar |
| ④ | import BaseHTTPServer <br> import SimpleHTTPServer <br> import CGIHttpServer | import http.server |
http.client मॉड्यूल एक अंतर्निहित पुस्तकालय को लागू करता है जिसका उपयोग HTTP संसाधनों के लिए अनुरोध करने और HTTP प्रतिक्रिया को पार्स करने के लिए किया जा सकता है।
http.cookies मॉड्यूल HTTP हेडर सेट-कुकी के माध्यम से भेजे गए कुकीज़ को प्राप्त करने के लिए एक पायथनिक इंटरफ़ेस प्रदान करता है
आम ब्राउज़र कुकीज़ को फ़ाइलों के रूप में डिस्क पर संग्रहीत करते हैं, और http.cookiejar मॉड्यूल इन फ़ाइलों को संचालित कर सकता है।
http.server मॉड्यूल एक बुनियादी HTTP सर्वर को लागू करता है
- urllib
पायथन 2 में कुछ मॉड्यूल हैं जो यूआरएल का विश्लेषण, एन्कोडिंग और एक्सेस करते हैं, लेकिन ये मॉड्यूल एक दूसरे पर एक माउस कॉर्ड की तरह ओवरलैप करते हैं। पायथन 3 में, इन मॉड्यूलों को एक अलग पैकेज, urllib, में पुनर्गठित किया गया है।
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | import urllib | import urllib.request <br> urllib.parse,urllib.error |
| ② | import urllib2 | import urllib.request <br> urllib.error |
| ③ | import urlparse | import urllib.parse |
| ④ | import robotparser | import urllib.robotparser |
| ⑤ | from urllib import FancyURLopener <br> from urllib import urlencode | from urllib.request import FancyURLopener <br> from urllib.parse import urlencode |
| ⑥ | from urllib2 import Request <br> from urllib2 import HTTPError | from urllib.request import Request <br> from urllib.error import HTTPError |
पहले, पाइथन 2 में urllib मॉड्यूल में विभिन्न प्रकार के फ़ंक्शंस थे, जिनमें urlopen () शामिल थे, जो डेटा प्राप्त करने के लिए उपयोग किए जाते थे, और यह यूआरएल को अपने घटक भागों में विभाजित करने के लिए भी उपयोगी है। splitype ()), splithost () और splituser () फ़ंक्शंस। नए urllib पैकेज में, ये फ़ंक्शंस अधिक तार्किक रूप से संगठित किए गए हैं। 2to3 इन फ़ंक्शंस के कॉल को नए नामकरण योजनाओं के अनुकूल संशोधित करेगा।
पाइथन 3 में, पिछले urllib2 मॉड्यूल को urllib पैकेज में शामिल किया गया है। साथ ही, urllib2 में आपकी पसंदीदा चीजें पाइथन 3 के urllib मॉड्यूल में एक बार में दिखाई देंगी, जैसे कि build_opener () विधि, अनुरोध ऑब्जेक्ट, HTTPBasicAuthHandler और मित्र।
पायथन 3 में urllib.parse मॉड्यूल में मूल पायथन 2 में urlparse मॉड्यूल के सभी पार्सिंग फ़ंक्शंस शामिल हैं।
urllib.robotparse मॉड्यूल robots.txt फ़ाइल को पार्स करता है।
FancyURLopener वर्ग जो HTTP पुनर्निर्देशन और अन्य स्थिति कोड को संभालता है, अभी भी पायथन 3 में urllib.request मॉड्यूल में काम करता है। urlencode () फ़ंक्शन को urllib.parse में स्थानांतरित कर दिया गया है।
अनुरोध ऑब्जेक्ट अभी भी urllib.request में मान्य है, लेकिन HTTPError जैसे स्थिरांक urllib.error में स्थानांतरित कर दिए गए हैं।
उदाहरण के लिए, यदि आप अपने Python 2 कोड में urllib मॉड्यूल को आयात करते हैं और urllib.urlopen () फ़ंक्शन को डेटा प्राप्त करने के लिए कहते हैं, तो 2to3 आयात कथन और फ़ंक्शन कॉल को संशोधित करेगा।
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | import urllib print urllib.urlopen('http://diveintopython3.org/').read() | import urllib.request, urllib.parse, urllib.error <br> print(urllib.request.urlopen('http://diveintopython3.org/').read()) |
- dbm
सभी डीबीएम क्लोन अब एक अलग पैकेज, डीबीएम में हैं। यदि आपको इनमें से किसी विशेष संस्करण की आवश्यकता है, जैसे कि जीएनयूडीबीएम, तो आप डीबीएम पैकेज में उपयुक्त मॉड्यूल आयात कर सकते हैं।
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | import dbm | import dbm.ndbm |
| ② | import gdbm | import dbm.gnu |
| ③ | import dbhash | import dbm.bsd |
| ④ | import dumbdbm | import dbm.dumb |
| ⑤ | import anydbm <br> import whichdb | import dbm |
- xmlrpc
XML-RPC HTTP प्रोटोकॉल के माध्यम से रिमोट RPC कॉल करने के लिए एक हल्के-स्तर का तरीका है। कुछ XML-RPC क्लाइंट और XML-RPC सर्वर-एंड कार्यान्वयन पुस्तकालयों को अब एक अलग पैकेज में जोड़ा गया है, xmlrpc।
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | import xmlrpclib | import xmlrpc.client |
| ② | import DocXMLRPCServer <br> import SimpleXMLRPCServer | import xmlrpc.server |
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | try:<br> import cStringIO as StringIO <br>except ImportError: <br> import StringIO | import io |
| ② | try:<br> import cPickle as pickle <br>except ImportError: <br> import pickle | import pickle |
| ③ | import _builtin_ | import builtins |
| ④ | import copy_reg | import copyreg |
| ⑤ | import Queue | import queue |
| ⑥ | import SocketServer | import socketserver |
| ⑦ | import ConfigParser | import configparser |
| ⑧ | import repr | import reprlib |
| ⑨ | import commands | import subprocess |
- Python 2 में, आप आमतौर पर ऐसा करते हैं, पहले cStringIO को StringIO के विकल्प के रूप में आयात करने का प्रयास करें, और यदि यह विफल रहता है, तो StringIO को आयात करें। Python 3 में ऐसा न करें; io मॉड्यूल आपको इस मामले में मदद करेगा। यह सबसे तेज़ उपलब्ध कार्यान्वयन का पता लगाएगा और फिर इसे स्वचालित रूप से उपयोग करेगा।
- पायथन 2 में, सबसे तेज़ पिकल कार्यान्वयन को आयात करना भी एक उपयोगी तरीका है, जैसा कि ऊपर बताया गया है। पायथन 3 में, पिकल मॉड्यूल आपके लिए इसे स्वचालित रूप से संभालता है, इसलिए ऐसा न करें।
- Builtins मॉड्यूल में वैश्विक फ़ंक्शंस, कक्षाएं और स्थिरांक शामिल हैं जो पूरे पायथन में उपयोग किए जाते हैं। Builtins मॉड्यूल में एक फ़ंक्शन को फिर से परिभाषित करने का मतलब है कि यह वैश्विक फ़ंक्शन हर जगह फिर से परिभाषित किया गया है। यह शक्तिशाली लगता है, लेकिन यह भी डरावना है।
- कॉपीरेग मॉड्यूल ने C भाषा में परिभाषित उपयोगकर्ता कस्टम प्रकारों के लिए पिकल मॉड्यूल का समर्थन जोड़ा है।
- क्यू मॉड्यूल एक उत्पादक-उपभोक्ता कतार (बहु-उत्पादक, बहु-उपभोक्ता कतार) को लागू करता है।
6। socketserver मॉड्यूल विभिन्न प्रकार के सॉकेट सर्वर को लागू करने के लिए एक सामान्य बुनियादी वर्ग प्रदान करता है।
7। configparser मॉड्यूल का उपयोग आईएनआई-स्टाइल कॉन्फ़िगरेशन फ़ाइलों को पार्स करने के लिए किया जाता है।
8, reprlib मॉड्यूल ने अंतर्निहित फ़ंक्शन repr (() को फिर से लागू किया और स्ट्रिंग को काटने से पहले लंबाई के लिए नियंत्रण जोड़ा। - subprocess मॉड्यूल आपको उप-प्रक्रियाएँ बनाने, उनके पाइपलाइन से जुड़ने और उनके रिटर्न मान प्राप्त करने की अनुमति देता है
- पैकेज के भीतर सापेक्ष आयात
एक पैकेज एक एकल इकाई है जो संबंधित मॉड्यूल के एक समूह से मिलकर बना है। पायथन 2 में, आप एक ही पैकेज के भीतर मॉड्यूल के लिए एक-दूसरे को संदर्भित करने के लिए आयात foo या from foo import Bar का उपयोग करते हैं। पायथन 2 व्याख्याकार वर्तमान निर्देशिका में foo.py की खोज करेंगे, फिर पायथन खोज पथ ((sys.path) में खोज करेंगे। पायथन 3 में यह प्रक्रिया थोड़ी अलग है। पायथन 3 पहले वर्तमान पथ पर खोज नहीं करेगा, यह सीधे पायथन के खोज पथ में खोज करेगा। यदि आप एक पैकेज में एक मॉड्यूल को दूसरे पैकेज में एक मॉड्यूल में लाना चाहते हैं, तो आपको स्पष्ट रूप से दो मॉड्यूल के लिए संबंधित पथ प्रदान करने की आवश्यकता है।
मान लीजिए कि आपके पास एक ही निर्देशिका में कई फाइलें हैंः
chardet/
|
+--init.py
|
+--constants.py
|
+--mbcharsetprober.py
|
+--universaldetector.py
अब मान लीजिए कि universaldetector.py को constants.py को आयात करने की आवश्यकता है, और इसके अलावा mbcharsetprober.py की एक श्रेणी को आयात करने की आवश्यकता है। आप क्या करेंगे?
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | import constants | from .import constants |
| ② | from mbcharsetprober import MultiByteCharSetProber | from .mbcharsetprober import MultiByteCharsetProber |
- जब आपको पैकेज के अन्य हिस्सों से पूरे मॉड्यूल को आयात करने की आवश्यकता होती है, तो नए from.import सिंटैक्स का उपयोग करें। यहाँ वाक्य संख्या (((.) वर्तमान फ़ाइल (universaldetector.py) और उस फ़ाइल (constants.py) के बीच के सापेक्ष पथ को दर्शाता है जिसे आप आयात करना चाहते हैं। इस उदाहरण में, ये दोनों फाइलें एक ही निर्देशिका में हैं, इसलिए एक एकल वाक्य संख्या का उपयोग किया गया है। आप इसे मूल निर्देशिका (((from .. import anothermodule) या उप-निर्देशिकाओं से भी आयात कर सकते हैं।
- किसी विशेष वर्ग या फ़ंक्शन को अन्य मॉड्यूल से सीधे आपके मॉड्यूल के नामस्थान में आयात करने के लिए, आयात किए जाने वाले मॉड्यूल नाम में सापेक्ष पथ जोड़ें और अंतिम स्लैश को हटा दें। इस उदाहरण में, mbcharsetprober.py और universaldetector.py एक ही निर्देशिका में हैं, इसलिए सापेक्ष पथ का नाम एक वाक्य संख्या है। आप इसे मूल निर्देशिका से भी आयात कर सकते हैं।
पायथन 2 में, iterator के पास एक next () विधि है जो अनुक्रम में अगले आइटम को वापस करने के लिए है। पायथन 3 में यह भी काम करता है, लेकिन अब एक नया वैश्विक फ़ंक्शन next () है, जो एक iterator को पैरामीटर के रूप में उपयोग करता है।
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | anIterator.next() | next(anIterator) |
| ② | a_function_that_returns_an_iterator().next() | next(a_function_that_returns_an_iterator()) |
| ③ | class A:<br> def next(self):<br> pass | class A:<br> def next(self):<br> pass| |
| ④ | class A:<br> def next(self, x, y):<br> pass | no change |
| ⑤ | next = 42<br>for an_iterator in a_sequence_of_iterators:<br> an_iterator.next() | next = 42<br>for an_iterator in a_sequence_of_iterators:<br> an_iterator.next() |
- सबसे सरल उदाहरण में, अब आप एक iterator के next (() विधि को नहीं बुलाते हैं, अब आप iterator को स्वयं को एक पैरामीटर के रूप में वैश्विक फ़ंक्शन next (()) में पास करते हैं।
- यदि आपके पास एक फ़ंक्शन है जिसका रिटर्न एक इनडेक्टर है, तो उस फ़ंक्शन को कॉल करें और परिणाम को next () फ़ंक्शन के लिए एक पैरामीटर के रूप में पास करें।
- यदि आप अपनी खुद की कक्षा को परिभाषित करते हैं, और फिर इसे एक iterator के रूप में उपयोग करते हैं, तो Python 3 में, आप विशेष विधियों को परिभाषित करके__next__() को पूरा करने के लिए।
- यदि आपके द्वारा परिभाषित कक्षा में एक next () है, तो यह एक या अधिक पैरामीटर का उपयोग करता है, इसे 2to3 निष्पादन के दौरान स्थानांतरित नहीं करता है। इस वर्ग को एक एडेप्टर के रूप में उपयोग नहीं किया जा सकता है, क्योंकि इसकी next () विधि में पैरामीटर हैं।
5। यह थोड़ा जटिल है। यदि आपके पास एक स्थानीय चर है जिसे next कहा जाता है, तो यह Python 3 में वैश्विक फ़ंक्शन next की तुलना में अधिक प्राथमिकता प्राप्त करता है))) । इस मामले में, आपको एक विशेष विधि का आह्वान करने की आवश्यकता है__next__() क्रम में अगला तत्व प्राप्त करने के लिए。(या, आप कोड को फिर से बना सकते हैं ताकि स्थानीय चर का नाम next न हो, लेकिन 2to3 आपके लिए ऐसा नहीं करेगा。)
पायथन 2 में, filter() विधि एक सूची लौटाता है, जो एक फ़ंक्शन द्वारा प्राप्त की जाती है जो अनुक्रम में प्रत्येक तत्व को सही या गलत मान देता है। पायथन 3 में, filter() फ़ंक्शन एक iterator लौटाता है, जो सूची नहीं है।
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | filter(a_function, a_sequence) | list(filter(a_function, a_sequence)) |
| ② | list(filter(a_function, a_sequence)) | no change |
| ③ | filter(None, a_sequence) | [i for iin a_sequence if i] |
| ④ | for i in filter(None, a_sequence): | no change |
| ⑤ | [i for iin filter(a_function, a_sequence)] | no change |
1, सबसे सरल स्थिति में, 2to3 एक सूची () फ़ंक्शन का उपयोग करके फ़िल्टर () को पैक करता है, और सूची () फ़ंक्शन इसके पैरामीटर के माध्यम से चलता है और फिर एक सूची देता है।
2. हालांकि, यदि filter() को सूचीबद्ध किया गया है, तो 2to3 इसे संसाधित नहीं करता है, क्योंकि इस स्थिति में यह महत्वपूर्ण नहीं है कि filter() का लौटाया गया मान एक iterator है या नहीं।
3। फ़िल्टर ((None, ...) की इस विशेष सिंटैक्स को संभालने के लिए, 2to3 इस कॉलिंग को सिंटैक्सिक रूप से समकक्ष रूप से सूची विश्लेषण में परिवर्तित करता है।
4. चूंकि for loop पूरे sequence में चलता है, इसलिए इसे बदलने की कोई आवश्यकता नहीं है
5. जैसा कि ऊपर किया गया है, कोई संशोधन करने की आवश्यकता नहीं है, क्योंकि सूची पार्सिंग पूरे अनुक्रम को पार करती है, और यहां तक कि अगर filter (() एक iterator लौटाता है, तो यह पहले की तरह ठीक से काम कर सकता है filter (() सूची लौटाता है।
फ़िल्टर () द्वारा किए गए परिवर्तनों की तरह, map () फ़ंक्शन अब एक iterator देता है। पायथन 2 में, यह एक सूची देता है।
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | map(a_function,'PapayaWhip') | list(map(a_function,'PapayaWhip')) |
| ② | map(None,'PapayaWhip') | list('PapayaWhip') |
| ③ | map(lambda x: x+1,range(42)) | [x+1for x in range(42)] |
| ④ | for i in map(a_function, a_sequence): | no change |
| ⑤ | [i for iin map(a_function,a_sequence)] | no change |
1। फ़िल्टर () के समान ही, 2to3 एक सूची () फ़ंक्शन का उपयोग करता है जो कि सबसे सरल स्थिति में, map () कॉल को पैक करता है।
2। विशेष map ((None, ...) सिंटैक्स के लिए, फ़िल्टर ((None, ...) की तरह, 2to3 इसे एक समकक्ष कॉल में बदल देगा जो list (() का उपयोग करता है
3 , यदि map () का पहला पैरामीटर एक lambda फ़ंक्शन है, तो 2to3 इसे समान रूप से सूची विश्लेषण में परिवर्तित करता है।
4. For loop जो पूरे sequence में चलता है, उसे बदलने की आवश्यकता नहीं है।
5. एक बार फिर, यहाँ कोई संशोधन करने की आवश्यकता नहीं है, क्योंकि सूची विश्लेषण पूरे अनुक्रम में चलता है, और यह ठीक से काम कर सकता है, भले ही map () के लिए लौटाया गया मान सूची के बजाय एक iterator है।
पायथन 3 में, reduce () फ़ंक्शन को वैश्विक नामस्थान से हटा दिया गया है और अब इसे fucntools मॉड्यूल में रखा गया है।
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | reduce(a, b, c) | from functools import reduce reduce(a, b, c) |
पायथन 2 में एक वैश्विक फ़ंक्शन है जिसका नाम है apply (), जो एक फ़ंक्शन f और एक सूची का उपयोग करता है[a, b, c] एक पैरामीटर के रूप में, यह f ((a, b, c) को लौटाता है। आप इस फ़ंक्शन को सीधे कॉल करके सूची से पहले एक तारांकन जोड़ सकते हैं।*) एक पैरामीटर के रूप में इसे पारित करने के लिए एक ही काम करता है। पायथन 3 में, apply (()) फ़ंक्शन अब मौजूद नहीं है; एक तारांकन विधि का उपयोग करना होगा।
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | apply(a_function, a_list_of_args) | a_function(*a_list_of_args) |
| ② | apply(a_function, a_list_of_args, a_dictionary_of_named_args) | a_function(*a_list_of_args,**a_dictionary_of_named_args) |
| ③ | apply(a_function, a_list_of_args+ z) | a_function(*a_list_of_args+ z) |
| ④ | apply(aModule.a_function, a_list_of_args) | aModule.a_function(*a_list_of_args) |
1, सबसे सरल रूप में, आप इस तरह के रूप में पैरामीटर सूची में (([a, b, c] के रूप में) फ़ंक्शन को कॉल करने के लिए एक तारांकन जोड़ें। यह पायथन 2 में apply () फ़ंक्शन के बराबर है।
2. पायथन 2 में, apply() फ़ंक्शन वास्तव में 3 पैरामीटर ले सकता हैः एक फ़ंक्शन, एक पैरामीटर सूची, और एक नामित तर्कों की शब्दकोश। पायथन 3 में, आप पैरामीटर सूची से पहले एक तारांकन जोड़कर कर सकते हैं*), शब्दकोश नामकरण पैरामीटर से पहले दो तारांकन जोड़ें ((**) एक ही प्रभाव प्राप्त करने के लिए।
3। ऑपरेटर + को यहाँ लिंक सूची के फ़ंक्शन के रूप में उपयोग किया जाता है, जो ऑपरेटर से अधिक प्राथमिकता रखता है*, इसलिए a_list_of_args + z के चारों ओर अतिरिक्त कोष्ठक जोड़ने की कोई आवश्यकता नहीं है
4, 2to3 स्क्रिप्ट काफी बुद्धिमान है जो जटिल apply () कॉल को परिवर्तित करने के लिए है, जिसमें आयात मॉड्यूल में फ़ंक्शन कॉल शामिल हैं।
पायथन 2 में, आप इंटरनल () फ़ंक्शन का उपयोग कर सकते हैं एक स्ट्रिंग पर कार्य करने के लिए इसे सीमित करने के लिए ताकि यह प्रदर्शन अनुकूलन प्राप्त कर सके। पायथन 3 में, इंटरनल () फ़ंक्शन को sys मॉड्यूल में स्थानांतरित कर दिया गया है।
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | intern(aString) | sys.intern(aString) |
-
exec कथन
जैसा कि प्रिंट कथन पायथन 3 में एक फ़ंक्शन बन जाता है, वैसे ही exec कथन भी होता है। .exec () फ़ंक्शन एक स्ट्रिंग का उपयोग करता है जिसमें किसी भी पायथन कोड को पैरामीटर के रूप में शामिल किया जाता है, और फिर इसे एक वाक्य या अभिव्यक्ति की तरह निष्पादित करता है। .exec () और eval () समान हैं, लेकिन exec () अधिक शक्तिशाली और अधिक कुशल हैं। .eval () फ़ंक्शन केवल एक एकल अभिव्यक्ति निष्पादित कर सकता है, लेकिन exec () कई वाक्यों को निष्पादित कर सकता है, आयात () और फ़ंक्शन घोषणाएँ कर सकता है।
| Notes | Python 2 | Python 3 |
|---|
|①|exec codeString|exec(codeString)
|②|exec codeString in a_global_namespace|exec(codeString, a_global_namespace)|
|③|exec codeString in a_global_namespace, a_local_namespace|exec(codeString, a_global_namespace,a_local_namespace)|
1, सबसे सरल रूप में, क्योंकि exec (() अब एक फ़ंक्शन है, न कि एक कथन, 2to3 इस स्ट्रिंग के रूप में कोड को कोष्ठक में घेर लेगा।
2. पायथन 2 में exec कथन नामस्थान को निर्दिष्ट कर सकता है, कोड को वैश्विक वस्तुओं से बने इस निजी स्थान में निष्पादित किया जाएगा। पायथन 3 में भी ऐसा ही है; आपको बस इस नामस्थान को दूसरे पैरामीटर के रूप में exec () फ़ंक्शन को पास करना होगा।
3. और भी अजीब बात यह है कि पायथन 2 में exec कथन एक स्थानीय नामस्थान निर्दिष्ट कर सकता है (जैसे कि एक फ़ंक्शन में घोषित चर) । पायथन 3 में, exec () फ़ंक्शन भी ऐसा ही करता है।
पहले के exec कथन की तरह, Python 2 में execfile कथन एक स्ट्रिंग का उपयोग कर सकता है जैसे कि यह Python कोड निष्पादित करता है। इसके विपरीत, exec स्ट्रिंग का उपयोग करता है, जबकि execfile फ़ाइल का उपयोग करता है। Python 3 में, execfile कथन को हटा दिया गया है। यदि आप वास्तव में एक फ़ाइल में Python कोड निष्पादित करना चाहते हैं, लेकिन आप इसे आयात नहीं करना चाहते हैं, तो आप फ़ाइल को खोलकर, इसकी सामग्री को पढ़ सकते हैं, और फिर compile () फ़ंक्शन को कॉल कर सकते हैं।
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | execfile('a_filename') | exec(compile(open('a_filename').read(),'a_filename','exec')) |
पायथन 2 में, किसी भी ऑब्जेक्ट के लिए स्ट्रिंग्स का प्रतिनिधित्व करने के लिए, ऑब्जेक्ट को कोट में लपेटें (उदाहरण के लिएx) की विशेष सिंटैक्स. पायथन 3 में, यह क्षमता अभी भी मौजूद है, लेकिन आप इस तरह के स्ट्रिंग को प्राप्त करने के लिए उद्धरणों का उपयोग नहीं कर सकते हैं। आपको वैश्विक फ़ंक्शन repr () का उपयोग करने की आवश्यकता है।
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | `x` | repr(x) |
| ② | `'PapayaWhip' + `2`` | repr('PapayaWhip'+ repr(2)) |
- याद रखें कि x कुछ भी हो सकता है जैसे कि एक वर्ग, फ़ंक्शन, मॉड्यूल, मूल डेटा प्रकार, आदि ≠ repr () फ़ंक्शन किसी भी प्रकार के पैरामीटर का उपयोग कर सकता है ≠
- पायथन 2 में, उलटा कोट पैच किया जा सकता है, जिसके परिणामस्वरूप यह भ्रमित करने वाला (लेकिन प्रभावी) अभिव्यक्ति .2to3 पर्याप्त बुद्धिमान है कि इस पैच कोरेड को repr () फ़ंक्शन में परिवर्तित किया जा सके।
पायथन 2 से पायथन 3 में, असामान्यताओं को पकड़ने के लिए कुछ बदलाव किए गए हैं।
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | try:<br> import mymodule<br>except ImportError, e<br> pass | try:<br> import mymodule<br>except ImportError as e:<br> pass |
| ② | try:<br> import mymodule<br>except (RuntimeError, ImportError), e<br> pass | try:<br> import mymodule<br>except (RuntimeError, ImportError) as e:<br> pass |
| ③ | try:<br> import mymodule<br>except ImportError:<br> pass | no change |
| ④ | try:<br> import mymodule<br>except:<br> pass | no change |
1, पायथन 2 में असामान्य प्रकार के बाद एक अल्पविराम जोड़ने के लिए, पायथन 3 एक नए कीवर्ड का उपयोग करता है, as。
2. कीवर्ड as का उपयोग एक ही समय में कई प्रकार की असामान्यताओं को पकड़ने के लिए किया जा सकता है।
3. यदि आप एक अपवाद को पकड़ते हैं, लेकिन अपवाद ऑब्जेक्ट को देखने की परवाह नहीं करते हैं, तो पायथन 2 और पायथन 3 की सिंटैक्स समान है।
4. इसी तरह, यदि आप सभी अपवादों को पकड़ने के लिए एक बीमा विधि का उपयोग करते हैं, तो पायथन 2 और पायथन 3 की सिंटैक्स समान है।
5. मॉड्यूल आयात करते समय (या अधिकांश अन्य मामलों में), आपको इस विधि का उपयोग नहीं करना चाहिए (उपरोक्त फॉलबैक को संदर्भित करें) । अन्यथा, प्रोग्राम कीबोर्ड इंटरप्ट (यदि उपयोगकर्ता Ctrl-C दबाता है तो प्रोग्राम को बाधित करता है) जैसी असामान्यताओं को पकड़ सकता है, जिससे डिबगिंग अधिक कठिन हो जाती है।
पायथन 3 में, कस्टम अपवादों को फेंकने के लिए सिंटैक्स में मामूली बदलाव किए गए हैं।
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | raise MyException | unchanged |
| ② | raise MyException,'error message' | raise MyException('error message') |
| ③ | raise MyException,'error message', a_traceback | raise MyException('errormessage').with_traceback(a_traceback) |
| ④ | raise 'error message' | unsupported |
- उपयोगकर्ता द्वारा अनुकूलित त्रुटि संदेशों के बिना असामान्यताओं को फेंकना, इस सबसे सरल रूप में, सिंटैक्स में कोई बदलाव नहीं।
- जब आप एक असामान्यता को उपयोगकर्ता-अनुकूलित त्रुटि संदेश के साथ फेंकना चाहते हैं, तो परिवर्तन स्पष्ट है। पायथन 2 असामान्यताओं और त्रुटि संदेशों को एक अल्पविराम से अलग करता है; पायथन 3 त्रुटि संदेशों को असामान्यताओं के लिए पैरामीटर के रूप में पास करता है।
- पायथन 2 एक अधिक जटिल सिंटैक्स का समर्थन करता है जो एक असामान्यता को फेंक देता है जिसमें उपयोगकर्ता द्वारा अनुकूलित स्टैक ट्रेस होता है। आप इसे पायथन 3 में भी कर सकते हैं, लेकिन यह पूरी तरह से अलग है।
- पायथन 2 में, आप केवल एक असामान्य संदेश के साथ एक अपवाद के बिना एक अपवाद फेंक सकते हैं। पायथन 3 में, यह प्रारूप अब समर्थित नहीं है। 2to3 आपको चेतावनी देगा कि यह स्वचालित रूप से इस तरह की सिंटैक्स को ठीक नहीं कर सकता है।
पायथन 2 में, जनरेटर में एक throw () विधि होती है। a_generator.throw () को कॉल करने से जनरेटर को रोक दिया जाता है और जनरेटर फ़ंक्शन द्वारा प्राप्त किए गए अगले मूल्य को वापस कर दिया जाता है। पायथन 3 में, यह सुविधा अभी भी उपलब्ध है, लेकिन सिंटैक्स में थोड़ा अलग है।
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | a_generator.throw(MyException) | no change |
| ② | a_generator.throw(MyException,'error message') | a_generator.throw(MyException('error message')) |
| ③ | a_generator.throw('error message') | unsupported |
- सबसे सरल रूप में, जनरेटर उपयोगकर्ता द्वारा अनुकूलित त्रुटि संदेशों के बिना असामान्यताओं को फेंक देता है। इस मामले में, पायथन 2 से पायथन 3 में सिंटैक्स में कोई बदलाव नहीं हुआ है।
- यदि जनरेटर उपयोगकर्ता के अनुकूलित त्रुटि संदेश के साथ एक अपवाद फेंकता है, तो आपको इसे उदाहरण देने के लिए इस त्रुटि संदेश स्ट्रिंग को अपवाद वर्ग को भेजना होगा।
- पायथन 2 भी केवल असामान्य संदेशों को फेंकने के लिए असामान्यताओं का समर्थन करता है. पायथन 3 इस तरह के सिंटैक्स का समर्थन नहीं करता है, और 2to3 एक चेतावनी संदेश दिखाएगा जो आपको बताता है कि आपको इस कोड को मैन्युअल रूप से ठीक करने की आवश्यकता है.
पायथन 2 में, एक निश्चित सीमा के भीतर संख्याओं को प्राप्त करने के दो तरीके हैंः range ((), जो एक सूची देता है, और range ((), जो एक iterator देता है। पायथन 3 में, range (() iterator देता है, xrange (() अब मौजूद नहीं है।
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | xrange(10) | range(10) |
| ② | a_list = range(10) | a_list = list(range(10)) |
| ③ | [i for iin xrange(10)] | [i for iin range(10)] |
| ④ | for i in range(10): | no change |
| ⑤ | sum(range(10)) | no change |
1। सबसे सरल स्थिति में, 2to3 बस xrange को रेंज में परिवर्तित करता है।
2, यदि आपका पायथन 2 कोड रेंज () का उपयोग करता है, तो 2to3 को पता नहीं है कि आपको एक सूची की आवश्यकता है, या क्या एक एडेप्टर भी काम करता है। सावधानी के लिए, 2to3 एक त्रुटि रिपोर्ट कर सकता है, और फिर list () का उपयोग करके रेंज () के रिटर्न को सूची प्रकार में परिवर्तित करने के लिए मजबूर कर सकता है।
3. यदि सूची में xrange () फ़ंक्शन है, तो इसके रिटर्न को सूची में परिवर्तित करने की आवश्यकता नहीं है, क्योंकि सूची विश्लेषण एक ही तरह से एक iterator के लिए काम करता है।
4. इसी तरह, for loop भी iterator पर कार्य करता है, इसलिए यहाँ भी कुछ नहीं बदलता है <unk>
5. sum ((() फ़ंक्शन एक iterator के रूप में कार्य करता है, इसलिए 2to3 ने यहां कोई संशोधन नहीं किया है। यह min (((), max (((), sum (((), list (((), tuple (((), set (((), sorted (((), any (((), all ((() के लिए भी वैसा ही है जैसा कि एक शब्दकोश विधि है जो सूची के बजाय दृश्य (((view) लौटाता है।
पायथन 2 में दो वैश्विक फ़ंक्शंस हैं जो कमांड लाइन में उपयोगकर्ता को इनपुट के लिए पूछते हैं। पहला इनपुट () कहा जाता है, जो उपयोगकर्ता के लिए एक पायथन एक्सप्रेशन () टाइप करने का इंतजार करता है और फिर परिणाम देता है। दूसरा raw_input () कहा जाता है, जो उपयोगकर्ता दर्ज करता है वह क्या लौटाता है। यह शुरुआती लोगों को बहुत भ्रमित करता है, और इसे व्यापक रूप से पायथन भाषा के लिए एक कॉर्नस्टॉक की तरह देखा जाता है। पायथन 3 ने इनपुट () को इनपुट () में बदलकर इस कॉर्नस्टॉक को काट दिया, इसलिए अब raw_input () काम करता है जैसा कि हर कोई शुरू में उम्मीद करता था।
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | raw_input() | input() |
| ② | raw_input('prompt') | input('prompt') |
| ③ | input() | eval(input()) |
1। सबसे सरल रूप में, raw_input (() को इनपुट (()) में बदल दिया गया है।
2, पायथन 2 में, raw_input (()) फ़ंक्शन एक संकेत को एक पैरामीटर के रूप में निर्दिष्ट कर सकता है। पायथन 3 में यह फ़ंक्शन संरक्षित है।
3. यदि आप वास्तव में चाहते हैं कि उपयोगकर्ता एक पायथन अभिव्यक्ति दर्ज करें और परिणामों की गणना करें, तो आप इनपुट () फ़ंक्शन को कॉल करके और वापस लौटे हुए मान को eval () () पर भेज सकते हैं।
पायथन 2 में, फ़ंक्शन का कोड फ़ंक्शन के विशेष गुणों तक पहुंच सकता है। पायथन 3 में, इन विशेष गुणों को निरंतरता के लिए नाम दिया गया है।
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | a_function.func_name | a_function._name_ |
| ② | a_function.func_doc | a_function._doc_ |
| ③ | a_function.func_defaults | a_function._defaults_ |
| ④ | a_function.func_dict | a_function._dict_ |
| ⑤ | a_function.func_closure | a_function._closure_ |
| ⑥ | a_function.func_globals | a_function._globals_ |
| ⑦ | a_function.func_code | a_function._code_ |
1、name विशेषता में फ़ंक्शन का नाम होता है।
2、__doc__attribute (मूल functiondoc) में आपके द्वारा फ़ंक्शन के स्रोत कोड में परिभाषित दस्तावेज़ स्ट्रिंग (docstring) होती है
3、__defaults__property ([[originalfunc_defaults]]) एक तत्व है जो पैरामीटर के डिफ़ॉल्ट मानों को संरक्षित करता है।
4、__dict__attribute ([[originalfunc_dict]]) एक नामस्थान है जो किसी भी फ़ंक्शन के गुणों का समर्थन करता है।
5、__closure__attribute ((मूलfunc_closure) एक सेल ऑब्जेक्ट से बना एक उपसमूह है, जिसमें फंक्शन के स्वतंत्र चर ((free variable) से बंधन शामिल है।
6、__globals__attribute ((मूलfunc_globals) मॉड्यूल के वैश्विक नामस्थान का एक संदर्भ है, फ़ंक्शन स्वयं इस नामस्थान में परिभाषित है।
7、code विशेषता ((मूल फंक्शन_कोड) एक कोड ऑब्जेक्ट है जो संकलित फ़ंक्शन निकाय को दर्शाता है।
पायथन 2 में, फ़ाइल ऑब्जेक्ट में एक xreadlines () विधि है जो एक एडेप्टर को वापस करती है जो एक बार में फ़ाइल की एक पंक्ति पढ़ता है। यह विशेष रूप से for चक्र में उपयोगी है। वास्तव में, बाद के पायथन 2 संस्करणों ने फ़ाइल ऑब्जेक्ट में इस तरह की सुविधा को जोड़ा है।
पायथन 3 में, xreadlines () विधि अब उपलब्ध नहीं है। 2to3 सरल स्थितियों को हल कर सकता है, लेकिन कुछ किनारे के मामलों में मैन्युअल हस्तक्षेप की आवश्यकता होती है।
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | for line in a_file.xreadlines(): | for line in a_file: |
| ② | for line in a_file.xreadlines(5): | no change (broken) |
- यदि आप xreadlines () को बिना किसी पैरामीटर के पहले कॉल करते हैं, तो 2to3 इसे फ़ाइल ऑब्जेक्ट में बदल देता है। पायथन 3 में, इस रूपांतरण के बाद का कोड वही काम करता है जो पहले किया गया थाः फ़ाइल की एक पंक्ति को एक बार पढ़ें और फिर for loop का loop निकालें।
यदि आपने पहले एक पैरामीटर ((प्रति बार पढ़ने वाली पंक्तियों की संख्या) को xreadlines () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () ()_io.TextIOWrapper' object has no attribute 'xreadlines'。 आप मैन्युअल रूप से xreadlines को readlines में बदल सकते हैं ताकि कोड Python 3 में काम कर सके。
पायथन 2 में, आप एक अनाम lambda फ़ंक्शन को परिभाषित कर सकते हैं, जो वास्तव में एक पैरामीटर के रूप में पैरामीटर के एक उपसमूह के तत्वों को निर्दिष्ट करके कई पैरामीटर प्राप्त करने में सक्षम है। वास्तव में, पायथन 2 के व्याख्याकार ने इस उपसमूह को नामित तर्कों में अनपैक कर दिया है, और फिर आप उन्हें नाम के माध्यम से संदर्भित कर सकते हैं। पायथन 3 में, आप अभी भी एक उपसमूह को lambda फ़ंक्शन के लिए पैरामीटर के रूप में पास कर सकते हैं, लेकिन पायथन व्याख्याकार इसे नामित पैरामीटर के रूप में नहीं करता है। आपको प्रत्येक पैरामीटर को संदर्भित करने के लिए स्थिति सूचकांक के माध्यम से संदर्भित करने की आवश्यकता है।
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | lambda (x,): x+ f(x) | lambda x1: x1[0]+f(x1[0]) |
| ② | lambda (x, y): x+f(y) | lambda x_y: x_y[0]+f(x_y[1]) |
| ③ | lambda (x,(y,z)): x+ y+ z | lambda x_y_z: x_y_z[0]+x_y_z[1][0]+ x_y_z[1][1] |
| ④ | lambda x, y, z: x+y + z | unchanged |
1, यदि आप एक lambda फ़ंक्शन को परिभाषित करते हैं, तो यह एक तत्व को शामिल करने वाले तत्व को पैरामीटर के रूप में उपयोग करता है, और पायथन 3 में, इसे x1 को शामिल करने वाले तत्व में बदल दिया जाता है।[0] में संदर्भित lambda फ़ंक्शन。x1 को 2to3 स्क्रिप्ट द्वारा मूल मेटासम में नामकरण पैरामीटर के आधार पर स्वचालित रूप से उत्पन्न किया गया है。
2। दो तत्वों वाले एक उपसमूह ((x, y) का उपयोग करते हुए lambda फ़ंक्शन को x_y में परिवर्तित किया जाता है, जिसमें दो स्थान पैरामीटर होते हैं, अर्थात् x_y[0] और x_y[1]。
3, 2to3 स्क्रिप्टों को एक lambda फ़ंक्शन के रूप में एक पैरामीटर के रूप में एक मापदंड का उपयोग करने के लिए एक मापदंड के रूप में एक मापदंड का उपयोग करने के लिए भी काम किया जा सकता है। परिणाम कोड को पढ़ने के लिए थोड़ा कठिन है, लेकिन यह पायथन 3 के तहत मूल कोड के रूप में पायथन 2 के तहत समान है।
4. आप एक lambda फ़ंक्शन को परिभाषित कर सकते हैं जो कई मापदंडों का उपयोग करता है। यदि कोई कोष्ठक मापदंडों के आसपास नहीं है, तो पायथन 2 इसे एक lambda फ़ंक्शन के रूप में मानता है जिसमें कई मापदंड हैं; इस lambda फ़ंक्शन बॉडी में, आप इन मापदंडों को नाम से संदर्भित करते हैं, जैसा कि अन्य प्रकार के कार्यों में किया जाता है। यह सिंटैक्स पायथन 3 में भी काम करता है।
पायथन 2 में, कक्षा विधियों को उनके वर्ग ऑब्जेक्ट (class object) को परिभाषित करने के लिए एक्सेस किया जा सकता है, और विधि ऑब्जेक्ट (method object) को स्वयं एक्सेस किया जा सकता है। im_self कक्षा का उदाहरण ऑब्जेक्ट है; im_func फ़ंक्शन ऑब्जेक्ट है, और im_class स्वयं कक्षा है। पायथन 3 में, इन गुणों को अन्य गुणों के नामकरण के अनुपालन के लिए नामित किया गया है।
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | aClassInstance.aClassMethod.im_func | aClassInstance.aClassMethod._func_ |
| ② | aClassInstance.aClassMethod.im_self | aClassInstance.aClassMethod._self_ |
| ③ | aClassInstance.aClassMethod.im_class | aClassInstance.aClassMethod._self_._class_ |
पायथन 2 में, आप अपनी खुद की कक्षाएं बना सकते हैं और उन्हें एक बूलियन संदर्भ में उपयोग कर सकते हैं। उदाहरण के लिए, आप इस वर्ग को उदाहरण दे सकते हैं और इस उदाहरण ऑब्जेक्ट को एक if कथन में उपयोग कर सकते हैं। इसके लिए, आप एक विशेष परिभाषित करते हैं__nonzero__() विधि, जिसका रिटर्न मान TRUE या FALSE है, यह विधि बुल पर संदर्भ में स्थित होने पर बुलाया जाता है। पायथन 3 में, आप अभी भी वही कार्य कर सकते हैं, लेकिन इस विशेष विधि का नाम बदल दिया गया है__bool__()。
| Notes | Python 2 | Python 3 |
|---|
|①|class A:<br> def nonzero(self):<br> pass|class A:<br> def bool(self):<br> pass
|②|class A:<br> def nonzero(self, x, y):<br> pass|no change|
- जब एक वर्ग ऑब्जेक्ट बुल पर संदर्भ में उपयोग किया जाता है, तो पायथन 3 कॉल करता है__bool_नहीं__nonzero__()。
2, हालांकि, अगर आप एक परिभाषित किया है दो मापदंडों के साथ__nonzero__() विधि, 2to3 स्क्रिप्ट यह मानती है कि आपके द्वारा परिभाषित विधि का कोई अन्य उपयोग है, इसलिए कोड में कोई बदलाव नहीं किया जाएगा।
पायथन 2 और पायथन 3 के बीच, octal संख्याओं को परिभाषित करने के लिए सिंटैक्स में थोड़ा बदलाव किया गया है।
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | x = 0755 | x = 0o755 |
क्योंकि लंबे पूर्णांक और पूर्णांक को एक साथ एकीकृत किया गया है, sys.maxint स्थिरता अब सटीक नहीं है। लेकिन क्योंकि यह मूल्य किसी विशेष मंच की क्षमता का पता लगाने के लिए उपयोगी है, इसे पायथन 3 में रखा गया है और इसका नाम बदलकर sys.maxsize कर दिया गया है।
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | from sys importmaxint | from sys importmaxsize |
| ② | a_function(sys.maxint) | a_function(sys.maxsize) |
- maxint को maxsize में बदल दिया गया है
- सभी sys.maxint को sys.maxsize में बदल दिया गया है <unk>
पायथन 2 में, आप वैश्विक फ़ंक्शन का उपयोग कर सकते हैं callable () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () ()__call_अस्तित्व के बारे में
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | callable(anything) | hasattr(anything,'_call_') |
पायथन 2 में, वैश्विक फ़ंक्शन zip() किसी भी अनुक्रम को पैरामीटर के रूप में उपयोग कर सकता है, यह एक मेटामॉडल से बनी सूची देता है। पहला मेटामॉडल प्रत्येक अनुक्रम के पहले तत्व को शामिल करता है; दूसरा मेटामॉडल प्रत्येक अनुक्रम के दूसरे तत्व को शामिल करता है; क्रमशः नीचे धकेल दिया गया। पायथन 3 में, zip() एक एडेप्टर देता है, सूची नहीं।
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | zip(a, b, c) | list(zip(a, b, c)) |
| ② | d.join(zip(a, b, c)) | no change |
सबसे सरल रूप में, आप सूची () फ़ंक्शन को कॉल करके zip () फ़ंक्शन से पहले के फ़ंक्शन को पुनर्स्थापित कर सकते हैं। सूची () फ़ंक्शन इस zip () फ़ंक्शन को लौटाने वाले एरे को पार करता है, और फिर परिणामों की सूची वापस करता है।
एक संदर्भ परिवेश में जो पहले से ही अनुक्रम के सभी तत्वों को पार कर चुका है (जैसे कि यहाँ join () विधि का आह्वान है), zip () लौटाए गए एडेप्टर को ठीक से काम करने की अनुमति देता है। 2to3 स्क्रिप्ट इन स्थितियों का पता लगाएगी और आपके कोड में कोई बदलाव नहीं करेगी।
पायथन 2 में, मानक त्रुटि StopIteration, GeneratorExit, KeyboardInterrupt, और SystemExit को छोड़कर सभी अन्य अंतर्निहित असामान्यताओं के लिए एक मूल वर्ग है। पायथन 3 में, मानक त्रुटि को हटा दिया गया है; इसे अपवादों के साथ प्रतिस्थापित किया गया है।
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | x =StandardError() | x =Exception() |
| ② | x =StandardError(a, b, c) | x =Exception(a, b, c) |
types मॉड्यूल में विभिन्न प्रकार के स्थिरांक हैं जो आपको किसी ऑब्जेक्ट के प्रकार को निर्धारित करने में मदद करते हैं। पायथन 2 में, इसमें सभी बुनियादी डेटा प्रकारों के लिए स्थिरांक शामिल हैं, जैसे कि डिक्ट और इंट। पायथन 3 में, ये स्थिरांक पहले से ही हटा दिए गए हैं। उन्हें केवल मूल प्रकार के नाम के साथ प्रतिस्थापित करने की आवश्यकता है।
| Notes | Python 2 | Python 3 |
|---|---|---|
| types.UnicodeType | str | |
| types.StringType | bytes | |
| types.DictType | dict | |
| types.IntType | int | |
| types.LongType | int | |
| types.ListType | list | |
| types.NoneType | type(None) | |
| types.BooleanType | bool | |
| types.BufferType | memoryview | |
| types.ClassType | type | |
| types.ComplexType | complex | |
| types.EllipsisType | type(Ellipsis) | |
| types.FloatType | float | |
| types.ObjectType | object | |
| types.NotImplementedType | type(NotImplemented) | |
| types.SliceType | slice | |
| types.TupleType | tuple | |
| types.TypeType | type | |
| types.XRangeType | range |
types.StringType को बाइट्स के रूप में मैप किया जाता है, न कि str, क्योंकि पायथन 2 में strings वास्तव में केवल कुछ बाइट्स की एक श्रृंखला होती है जो किसी प्रकार के वर्णों के साथ एन्कोड की जाती है।
isinstance() फ़ंक्शन यह जांचता है कि कोई ऑब्जेक्ट किसी विशेष प्रकार (class) या प्रकार (type) का उदाहरण है या नहीं। पायथन 2 में, आप प्रकार (types) से बना एक उपसमूह को instance () पर पास कर सकते हैं, और यदि ऑब्जेक्ट उपसमूह में किसी भी प्रकार का है, तो फ़ंक्शन True () लौटाता है। पायथन 3 में, आप अभी भी ऐसा कर सकते हैं, लेकिन एक प्रकार को दो बार पास करने की अनुशंसा नहीं की जाती है।
| Notes | Python 2 | Python 3 |
|---|---|---|
| isinstance(x,(int,float,int)) | isinstance(x,(int,float)) |
पायथन 2 में दो प्रकार के स्ट्रिंग प्रकार हैंः यूनिकोड-एन्कोडेड स्ट्रिंग और गैर-यूनिकोड-एन्कोडेड स्ट्रिंग। लेकिन वास्तव में एक और प्रकार है, जो कि बेसस्ट्रिंग है। यह एक अमूर्त डेटा प्रकार है, जो स्ट्र और यूनिकोड प्रकारों का एक सुपरक्लास है। इसे सीधे नहीं बुलाया जा सकता है या इंस्टेंस किया जा सकता है, लेकिन आप इसे एक उदाहरण के रूप में उपयोग कर सकते हैं। एक ऑब्जेक्ट का पता लगाने के लिए कि क्या यह एक यूनिकोड स्ट्रिंग या गैर-यूनिकोड स्ट्रिंग है। पायथन 3 में, केवल एक स्ट्रिंग प्रकार है, इसलिए बेसस्ट्रिंग की कोई आवश्यकता नहीं है।
| Notes | Python 2 | Python 3 |
|---|---|---|
| isinstance(x, basestring) | isinstance(x, str) |
पायथन 2.3 में itertools मॉड्यूल को पेश किया गया है, जो वैश्विक फ़ंक्शन zip (), map (), filter (), और variants (variants) को परिभाषित करता है, जो इन प्रकारों को सूची के बजाय iterator के रूप में लौटाता है। पायथन 3 में, इन itertools में इन प्रकारों को हटा दिया गया है क्योंकि इन वैश्विक फ़ंक्शंस का रिटर्न प्रकार मूल रूप से iterator है। (itertools मॉड्यूल में अभी भी कई अन्य उपयोगी फ़ंक्शंस हैं, न कि केवल ऊपर सूचीबद्ध हैं।)
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | itertools.izip(a, b) | zip(a, b) |
| ② | itertools.imap(a, b) | map(a, b) |
| ③ | itertools.ifilter(a, b) | filter(a, b) |
| ④ | from itertools import imap, izip, foo | from itertools import foo |
- वैश्विक zip () फ़ंक्शन का उपयोग करें, itertools.izip () के बजाय।
- map का उपयोग करें, न कि itertools.imap का।
3। itertools.ifilter() फ़िल्टर बन गया है।
4। itertools मॉड्यूल Python 3 में रहता है, यह केवल उन कार्यों को शामिल नहीं करता है जिन्हें वैश्विक नामस्थान में स्थानांतरित कर दिया गया है। 2to3 स्क्रिप्ट पर्याप्त बुद्धिमान है जो अन्य आयातित कथनों की अखंडता को बनाए रखते हुए उन आयातित कथनों को हटा देता है जो अब उपयोगी नहीं हैं।
अपवादों को संभालने के लिए, sys मॉड्यूल में तीन चर हैं जिन्हें आप एक्सेस कर सकते हैंः sys.exc_type, sys.exc_value, sys.exc_traceback. (वास्तव में, ये पायथन 1 के दिनों में थे) पायथन 1.5 के बाद से, नए पायथन के साथ, इन तीनों का उपयोग करना अनुशंसित नहीं है। sys.exc_info, जो उपरोक्त सभी तीन तत्वों को शामिल करने वाला एक उपसमूह है। पायथन 3 में, ये तीन चर अंततः मौजूद नहीं हैं; इसका मतलब है कि आपको sys.exc_info का उपयोग करना होगा।
| Notes | Python 2 | Python 3 |
|---|---|---|
| sys.exc_type | sys.exc_info()[0] | |
| sys.exc_value | sys.exc_info()[1] | |
| sys.exc_traceback | sys.exc_info()[2] |
पायथन 2 में, यदि आपको एक पारवर्ती तत्व के लिए सूची विश्लेषण लिखने की आवश्यकता है, तो आपको तत्व के मान के चारों ओर कोष्ठक जोड़ने की आवश्यकता नहीं है। पायथन 3 में, ये कोष्ठक आवश्यक हैं।
| Notes | Python 2 | Python 3 |
|---|---|---|
| [i for iin 1,2] | [i for iin(1,2)] |
पायथन 2 में एक फ़ंक्शन है जिसे os.getcwd() कहा जाता है, जो वर्तमान कार्य निर्देशिका को एक गैर-यूनिकोड स्ट्रिंग के रूप में लौटाता है। चूंकि आधुनिक फाइल सिस्टम निर्देशिका नामों को संभाल सकते हैं जो हाइट्रेट-कोडेड हैं, पायथन 2.3 में os.getcwdu ((() फ़ंक्शन को पेश किया गया है। os.getcwdu ((() फ़ंक्शन वर्तमान कार्य निर्देशिका में यूनिकोड-कोडेड स्ट्रिंग लौटाता है। पायथन 3 में, क्योंकि केवल एक स्ट्रिंग प्रकार है (((यूनिकोड प्रकार का), आपको केवल getos.cwd (() की आवश्यकता है।
| Notes | Python 2 | Python 3 |
|---|---|---|
| os.getcwdu() | os.getcwd() |
पायथन 2 में, आप मेटाक्लास मापदंडों को परिभाषित कर सकते हैं, या एक विशेष वर्ग-स्तरीय को परिभाषित कर सकते हैं__metaclass_पायथन 3 में, यह एक विशेष प्रकार का फ़ंक्शन है, जो एक विशेष प्रकार का फ़ंक्शन बनाता है, जो एक विशेष प्रकार का फ़ंक्शन है।metaclass विशेषता को हटा दिया गया है.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | class C(metaclass=PapayaMeta):<br> pass | unchanged |
| ② | class Whip:<br> _metaclass_ = PapayaMeta | class Whip(metaclass=PapayaMeta):<br> pass |
| ③ | class C(Whipper, Beater):<br> _metaclass_ = PapayaMeta | class C(Whipper,Beater,metaclass=PapayaMeta):<br> pass |
- जब आप किसी class को declare करते हैं तो metaclass arguments को declare करते हैं, जो Python 2 और Python 3 दोनों में काम करता है, वे समान हैं <unk>
2। कक्षा की परिभाषा में घोषित करें कि metaclass विशेषता पायथन 2 में मान्य है, लेकिन पायथन 3 में अब मान्य नहीं है।
3, 2to3 एक वैध वर्ग कथन का निर्माण करने में सक्षम है, भले ही यह वर्ग कई पितृ वर्गों से विरासत में मिले हों।
नीचे सूचीबद्ध सुधारों को वास्तविक सुधार नहीं माना जाता है। यानी, वे केवल कोड की शैली के बारे में हैं, कोड के सार के बारे में नहीं। लेकिन पायथन के डेवलपर्स को कोड शैली को यथासंभव सुसंगत बनाने में बहुत रुचि है। इसके लिए, एक आधिकारिक मैनुअल है जो विशेष रूप से पायथन कोड शैली का वर्णन करता है।
-
set{"शब्दार्थ"}{"शब्दार्थ"}
पायथन 2 में, एक शाब्दिक मान सेट को परिभाषित करने का एकमात्र तरीका सेट को कॉल करना है। पायथन 3 में यह अभी भी काम करता है, लेकिन नए अंकन चिह्नों का उपयोग करनाः शाब्दिक संकेतनः बड़े कोष्ठक में {}) एक स्पष्ट तरीका है। यह खाली सेट के अलावा भी काम करता है, क्योंकि शब्दकोश भी बड़े कोष्ठक में चिह्नित होते हैं, इसलिए {} एक खाली शब्दकोश को दर्शाता है, न कि एक खाली सेट।
2to3 स्क्रिप्ट डिफ़ॉल्ट रूप से set (()) शाब्दिक मानों को ठीक नहीं करता है। इस सुविधा को सक्षम करने के लिए, कमांड लाइन पर 2to3 को कॉल करते समय -f set_literal पैरामीटर निर्दिष्ट करें।
| Notes | Before | After |
|---|---|---|
| set([1,2,3]) | {1,2,3} | |
| set((1,2,3)) | {1,2,3} | |
| set([i for iin a_sequence]) | {i for iin a_sequence} |
-
ग्लोबल फंक्शन बफर
C में लागू Python ऑब्जेक्ट्स एक बफ़र इंटरफेस का निर्यात करते हैं, जो अन्य Python कोड को सीधे मेमोरी को पढ़ने और लिखने की अनुमति देता है। यह बहुत शक्तिशाली लगता है, लेकिन यह भी भयानक है।
2to3 स्क्रिप्ट डिफ़ॉल्ट रूप से buffer () फ़ंक्शन को ठीक नहीं करता है। इस फ़ंक्शन को सक्षम करने के लिए, कमांड लाइन पर 2to3 कॉल करते समय -f buffer पैरामीटर निर्दिष्ट करें।
| Notes | Before | After |
|---|---|---|
| x =buffer(y) | x =memoryview(y) |
-
अल्पविराम के चारों ओर रिक्त स्थान ((स्पष्ट)
हालांकि, इंडेंटिंग और आउटडेंटिंग के लिए रिक्त स्थान के लिए पाइथन की सख्त आवश्यकताएं हैं, लेकिन अन्य क्षेत्रों में रिक्त स्थान का उपयोग करने के लिए पाइथन काफी उदार है। सूची, उपसमूह, संग्रह और शब्दकोश में, रिक्त स्थान कॉमा के आगे या पीछे दिखाई दे सकता है, जिसका कोई बुरा प्रभाव नहीं होगा। हालांकि, पायथन कोड स्टाइल गाइड में कहा गया है कि कॉमा से पहले कोई रिक्त स्थान नहीं हो सकता है, और कॉमा के बाद एक रिक्त स्थान होना चाहिए। हालांकि यह केवल एक सौंदर्य संबंधी विचार है (कोड अभी भी ठीक काम कर सकता है, पायथन 2 और पायथन 3 में भी), लेकिन 2to3 स्क्रिप्ट आपके लिए इस मरम्मत को पूरा कर सकती है, जो कि मैनुअल पर है) ।
2to3 स्क्रिप्ट डिफ़ॉल्ट रूप से कॉमा के चारों ओर रिक्त स्थान को ठीक नहीं करता है। इस सुविधा को चालू करने के लिए, कमांड लाइन पर 2to3 कॉल करते समय -f wscomma पैरामीटर निर्दिष्ट करें।
| Notes | Before | After |
|---|---|---|
| a ,b | a, b | |
| {a :b} | {a: b} |
-
सामान्य भाषाएँ
कई प्रथाएं पाइथन समुदाय में स्थापित की गई हैं। जैसे कि while 1: loop, जो पाइथन 1 पर वापस जाती है। पाइथन में पाइथन 2.3 तक बुल प्रकार के वास्तविक अर्थ नहीं थे, इसलिए डेवलपर्स ने पहले 1 और 0 के विकल्पों का उपयोग किया था।
2to3 स्क्रिप्ट इन प्रथाओं के लिए डिफ़ॉल्ट रूप से कोई सुधार नहीं करता है। इस सुविधा को चालू करने के लिए, कमांड लाइन पर 2to3 कॉल करते समय -f idioms पैरामीटर निर्दिष्ट करें।
| Notes | Before | After |
|---|---|---|
| while 1:<br> do_stuff() | while True:<br> do_stuff() | |
| type(x) == T | isinstance(x, T) | |
| type(x) is T | isinstance(x, T) | |
| a_list = list(a_sequence) | a_list = sorted(a_sequence) | |
| a_list.sort() | do_stuff(a_list) | |
| do_stuff(a_list) |
फ़ोटो साभारःसीएसडीएन ब्लॉग
पायथन 2 कोड को पायथन 3 कोड में कैसे बदलें
पायथन 2.x कोड को पायथन 3.x कोड में कैसे बदलें
पायथन 2.x कोड को पायथन 3.x कोड में कैसे बदलें
यह बहुत कुछ नहीं है, अगर यह केवल कुछ कार्यों को शामिल करता है, जैसे कि प्रिंट आदि।
तो आप कोड में बदलाव कर सकते हैं।
Python 2.x संस्करण, जैसे कि Python 2.7.2 जिसे मैंने स्थापित किया है, विंडोज डाउनलोड और इंस्टॉल करने के बाद कुछ उपयोगी टूल के साथ आता है।
और उनमें से एक का नाम है 2to3.py, जो आपको पायथन 2.x के कोड को पायथन 3.x के कोड में बदलने में मदद करता है.
यह पायथन 27 टूल्स स्क्रिप्ट्स में स्थित है।
2to3.py का उपयोग कैसे करें, पायथन 2.x कोड को पायथन 3.x कोड में बदलने के लिए
उदाहरण के लिए, मेरे पास पायथन 2.x के लिए एक पायथन स्क्रिप्ट हैः
D:\tmp\tmp_dev_root\python\python2_to_python3\34563264_data_from_site.py
अब, इसे Python 3.x में बदलने के लिए कोड <unk>
विंडोज के cmd को खोलने के लिए, स्क्रिप्ट के नीचे स्थानांतरित करें और इसे चलाएं
D:\tmp\WordPress\DevRoot\Python27\Tools\Scripts\2to3.py -w 34563264_data_from_site.py
यह एक सफल रूपांतरण है, जिसके परिणामस्वरूपः
D:\tmp\tmp_dev_root\python\python2_to_python3>D:\tmp\WordPress\DevRoot\Python27\Tools\Scripts\2to3.py -w 34563264_data_from_site.py
RefactoringTool: Skipping implicit fixer: buffer
RefactoringTool: Skipping implicit fixer: idioms
RefactoringTool: Skipping implicit fixer: set_literal
RefactoringTool: Skipping implicit fixer: ws_comma
RefactoringTool: Refactored 34563264_data_from_site.py
--- 34563264_data_from_site.py (original)
+++ 34563264_data_from_site.py (refactored)
@@ -18,7 +18,7 @@
import time;
import codecs;
import logging;
-import urllib;
+import urllib.request, urllib.parse, urllib.error;
from datetime import datetime,timedelta;
from optparse import OptionParser;
from string import Template,replace;
@@ -90,7 +90,7 @@
foundPhone = eachItemSoup.find(attrs={"class":"phone"});
logging.debug("foundPhone=%s", foundPhone);
if(foundPhone):
- foundPhoneUni = unicode(foundPhone);
+ foundPhoneUni = str(foundPhone);
logging.debug("foundPhoneUni=%s", foundPhoneUni);
# case 1:
#<p class="phone"><strong>phone:</strong> 800.206.7886<br />
@@ -122,7 +122,7 @@
foundWeb = eachItemSoup.find(attrs={"class":"web"});
logging.debug("foundWeb=%s", foundWeb);
if(foundWeb):
- foundWebUni = unicode(foundWeb);
+ foundWebUni = str(foundWeb);
logging.debug("foundWebUni=%s", foundWebUni);
# <p class="web"><strong>e-mail:</strong> <a href="#">[email protected]</a><br />
@@ -151,7 +151,7 @@
foundAddr = eachItemSoup.find(attrs={"class":"addr"});
logging.debug("foundAddr=%s", foundAddr);
if(foundAddr):
- foundAddrUni = unicode(foundAddr);
+ foundAddrUni = str(foundAddr);
# <p class="addr">
# <strong>address:</strong> 740 SW 21st Ave, Suite #310<br />
RefactoringTool: Files that were modified:
RefactoringTool: 34563264_data_from_site.py
अब, आप देख सकते हैं कि मूल 34563264_data_from_site.py, Python 3.x के लिए कोड में बदल गया है।
इसके लिए, एक और bak फ़ाइलः:34563264_data_from_site.py.bak, दोनों की तुलना करें और अंतर देखेंः
वर्तमान में, 2to3.py के बारे में और अधिक जानकारी के लिए, कृपया मदद देखेंः
D:\tmp\tmp_dev_root\python\python2_to_python3>D:\tmp\WordPress\DevRoot\Python27\Tools\Scripts\2to3.py -h
Usage: 2to3 [options] file|dir ...
Options:
-h, --help show this help message and exit
-d, --doctests_only Fix up doctests only
-f FIX, --fix=FIX Each FIX specifies a transformation; default: all
-j PROCESSES, --processes=PROCESSES
Run 2to3 concurrently
-x NOFIX, --nofix=NOFIX
Prevent a transformation from being run
-l, --list-fixes List available transformations
-p, --print-function Modify the grammar so that print() is a function
-v, --verbose More verbose logging
--no-diffs Don't show diffs of the refactoring
-w, --write Write back modified files
-n, --nobackups Don't write backups for modified files
यह लेख केवल कुछ स्पष्टीकरण देता हैः
(1) यदि उपरोक्त कोई -w पैरामीटर नहीं है, तो डिफ़ॉल्ट रूप से केवल वर्तमान विंडो में रूपांतरण प्रक्रिया से मेल खाने वाले डिफ़ सामग्री को प्रिंट करें।
(2) -w जोड़ा गया है, जो मूल दस्तावेज़ पर वापस लिखा गया है।
(3) यदि आप एक bak फ़ाइल उत्पन्न नहीं करना चाहते हैं, तो -n जोड़ें।
(4) आप उस आउटपुट के ढेर को नहीं देखना चाहते हैं, नो-डिफ्स के साथ।
अन्य के बारे में ज्यादा जानकारी नहीं दी गई है।
उपरोक्त 2 से 3 का उपयोगरास्ते में
अगर कोई गलती है तो कृपया मुझे बताएं! ^_^

