প্রায় সকল পাইথন ২ প্রোগ্রামের কিছু পরিবর্তন প্রয়োজন যাতে তারা পাইথন ৩ এর পরিবেশে সঠিকভাবে কাজ করতে পারে। এই রূপান্তর প্রক্রিয়াটি সহজ করার জন্য, পাইথন ৩ একটি 2to3 ইউটিলিটি স্ক্রিপ্ট নিয়ে আসে যা আপনার পাইথন ২ প্রোগ্রামের উত্স ফাইলগুলিকে ইনপুট হিসাবে নেয় এবং স্বয়ংক্রিয়ভাবে এটিকে পাইথন ৩ এর ফর্ম্যাটে রূপান্তর করে। কেস স্টাডিঃ chardet কে পাইথন ৩ তে পোর্ট করা (porting chardet to Python 3) এই স্ক্রিপ্টটি কীভাবে চালানো যায় তা বর্ণনা করে এবং কিছু পরিস্থিতিতে দেখায় যেখানে এটি স্বয়ংক্রিয়ভাবে মেরামত করতে পারে না। এই সংযোজনটি বর্ণনা করে যে এটি স্বয়ংক্রিয়ভাবে মেরামত করতে পারে।
পাইথন ২ এ, print একটি বাক্য। আপনি যা কিছু আউটপুট করতে চান, আপনি কেবল সেগুলি print কীওয়ার্ডের পরে রেখে দিতে পারেন। পাইথন ৩ এ, 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 () কল করতে হবে যার কোন প্যারামিটার নেই। ২। একটি পৃথক মান আউটপুট করার জন্য, print () এর একটি প্যারামিটার হিসাবে এই মানটি ব্যবহার করতে হবে। 3। প্রিন্ট () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () ৪। এই উদাহরণে কিছু কৌশল আছে। পাইথন ২ এ, যদি আপনি print বাক্যাংশের শেষে একটি কমা (,) ব্যবহার করেন, তবে এটি একটি ফাঁকা দিয়ে আউটপুটকে পৃথক করবে, এবং তারপর একটি অনুসরণকারী ফাঁকা (,) ট্রেইলিং স্পেস) আউটপুট করবে, ক্যারিজ রিটার্ন না করে। পাইথন ৩ এ, একই প্রভাবটি প্রিন্টের কাছে একটি কীওয়ার্ড প্যারামিটার হিসাবে end=’ ‘ দিয়ে সম্পন্ন করা যেতে পারে। প্যারামিটারটির ডিফল্ট মান হল ‘\n’, তাই শেষ প্যারামিটারটির মান পুনঃনির্ধারণ করে, আপনি শেষের দিকে ক্যারিজ রিটার্ন চিহ্নটি বাতিল করতে পারেন। ৫. পাইথন ২ এ, আপনি >>pipe_name সিনট্যাক্স ব্যবহার করে আউটপুটকে একটি পাইপলাইনে পুনর্নির্দেশ করতে পারেন, যেমন sys.stderr। পাইথন ৩ এ, আপনি একই কাজটি করতে পারেন পাইপলাইনের মানগুলি কীওয়ার্ড প্যারামিটার ফাইল হিসাবে প্রিন্টের কাছে প্রেরণ করে। প্যারামিটার ফাইলের ডিফল্ট মানটি std.stdout, তাই এর মানটি পুনঃনির্ধারণ করা প্রিন্টকে অন্য একটি পাইপলাইনে আউটপুট দেবে।
পাইথন ২ এ দুই ধরনের স্ট্রিং টাইপ রয়েছেঃইউনিকোড স্ট্রিংএবংঅ-ইউনিকোড স্ট্রিংপাইথন 3 এর একটি মাত্র টাইপ আছে:ইউনিকোড স্ট্রিং。
Notes | Python 2 | Python 3 |
---|---|---|
① | u’PapayaWhip’ | ‘PapayaWhip’ |
② | ur’PapayaWhip\foo’ | r’PapayaWhip\foo’ |
পাইথন ২ এর ইউনিকোড স্ট্রিংগুলি পাইথন ৩ এ সাধারণ স্ট্রিং, কারণ পাইথন ৩ এ স্ট্রিংগুলি সর্বদা ইউনিকোড ফর্ম্যাট থাকে। ইউনিকোড অরিজিনাল স্ট্রিং ((raw string) ((এই স্ট্রিং ব্যবহার করে, পাইথন স্বয়ংক্রিয়ভাবে বিপরীত ক্রিয়াটি অনুবাদ করে না”“) সাধারণ স্ট্রিং দ্বারা প্রতিস্থাপিত হয়েছে, কারণ পাইথন 3 এ, সমস্ত অরিজিনাল স্ট্রিং ইউনিকোডে এনকোড করা হয়েছে।
পাইথন ২-এ দুটি গ্লোবাল ফাংশন রয়েছে যা বস্তুটিকে স্ট্রিংয়ে রূপান্তর করতে বাধ্য করেঃ unicode ((() যা বস্তুটিকে ইউনিকোড স্ট্রিংয়ে রূপান্তর করে, এবং str ((() যা বস্তুটিকে নন-ইউনিকোড স্ট্রিংয়ে রূপান্তর করে। পাইথন ৩-এ কেবলমাত্র একটি স্ট্রিং টাইপ রয়েছে, ইউনিকোড স্ট্রিং, তাই str ((() ফাংশনটি সমস্ত কার্য সম্পাদন করতে পারে।unicode() ফাংশনটি পাইথন ৩ এ আর বিদ্যমান নেই )
Notes | Python 2 | Python 3 |
---|---|---|
① | unicode(anything) | str(anything) |
পাইথন ২-এ নন-ফ্লোটিং পয়েন্টের জন্য int এবং long টাইপ রয়েছে। int টাইপের সর্বোচ্চ মানটি sys.maxint এর চেয়ে বেশি হতে পারে না, এবং এই সর্বোচ্চ মানটি প্ল্যাটফর্মের সাথে সম্পর্কিত। আপনি সংখ্যার শেষে একটি এল সংযুক্ত করে লম্বা পূর্ণসংখ্যা সংজ্ঞায়িত করতে পারেন। স্পষ্টতই, এটি int টাইপ দ্বারা উপস্থাপিত সংখ্যার চেয়ে বৃহত্তর পরিসীমা। পাইথন ৩-এ কেবলমাত্র একটি পূর্ণসংখ্যা টাইপ int রয়েছে, যা বেশিরভাগ ক্ষেত্রে পাইথন ২-এর মতো দীর্ঘ পূর্ণসংখ্যা। যেহেতু দুটি ধরণের পূর্ণসংখ্যা বিদ্যমান নেই, তাই তাদের পার্থক্য করার জন্য বিশেষ ব্যাকরণ ব্যবহার করার প্রয়োজন নেই।
পিইপি ২৩৭: ইউনিফাইড লং ও ইন্টিগ্রেটেড টাইপ।
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) |
পাইথন ২-এ দশমিকের দীর্ঘ পূর্ণসংখ্যা পাইথন ৩-এ দশমিকের সাধারণ পূর্ণসংখ্যা দ্বারা প্রতিস্থাপিত হয়েছে। পাইথন ২-এ ষোড়শ সংখ্যাযুক্ত দীর্ঘ পূর্ণসংখ্যাকে পাইথন ৩-এ ষোড়শ সংখ্যাযুক্ত সাধারণ পূর্ণসংখ্যা দ্বারা প্রতিস্থাপিত করা হয়েছে। পাইথন ৩ এ, লম্বা পূর্ণরূপ আর নেই, তাই এটিকে “অনুপস্থিত” বলা হয়।প্রাকৃতিক long () ফাংশনটিও নেই। একটি পরিবর্তনশীলকে একটি পূর্ণরূপে রূপান্তর করতে বাধ্য করার জন্য int () ফাংশন ব্যবহার করা যেতে পারে。 একটি ভেরিয়েবল পূর্ণসংখ্যা কিনা তা পরীক্ষা করে, তার ডেটা টাইপ পায় এবং একটি int টাইপের সাথে তুলনা করে (যেটা দীর্ঘ নয়) । আপনি ইনস্ট্যান্স () ফাংশন ব্যবহার করে ডেটা টাইপ পরীক্ষা করতে পারেন; আবারও জোর দিয়ে বলতে চাই, পূর্ণসংখ্যা টাইপ পরীক্ষা করার জন্য int ব্যবহার করুন, লং নয়।
পাইথন ২ সমর্থন করে <> হিসাবে! = এর সমার্থক। পাইথন ৩ শুধুমাত্র! = সমর্থন করে, আর সমর্থন করে না <>।
Notes | Python 2 | Python 3 |
---|---|---|
① | if x <> y: | if x != y: |
② | if x <> y<> z: | if x != y!= z: |
১। সহজভাবে তুলনা করা। ২। তিনটি তুলনামূলক জটিল মানের মধ্যে তুলনা।
পাইথন ২ তে, ডিকশনারি অবজেক্টের has_key ((() পদ্ধতি যা একটি নির্দিষ্ট কী রয়েছে কিনা তা পরীক্ষা করার জন্য ব্যবহৃত হয় (((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) |
১। সবচেয়ে সহজ ফর্ম ২। or অপারেটরের অগ্রাধিকার in অপারেটরের চেয়ে কম, তাই এখানে বন্ধনী যোগ করার প্রয়োজন নেই। ৩। অন্যদিকে, একই কারণে, or এর অগ্রাধিকার in এর চেয়ে কম, এখানে বন্ধনী যুক্ত করতে হবে। উল্লেখ্যঃ এখানে কোডটি পূর্বের লাইনের থেকে সম্পূর্ণ ভিন্ন। পাইথন প্রথমে x or y ব্যাখ্যা করবে, ফলাফল x ((যদি x এর মানটি বুলে সত্য হয়) বা y। তারপরে পাইথন পরীক্ষা করে যে ফলাফলটি a কিনা_একটি শব্দকোষের একটি কী।) ৪. অপারেটর in এর অগ্রাধিকার অপারেটর + এর চেয়ে কম, তাই কোডের এই ফর্মটি প্রযুক্তিগতভাবে বন্ধনীগুলির প্রয়োজন হয় না, তবে ২-টু-৩ যোগ করা হয়। ৫। এই ফর্মটি অবশ্যই বন্ধনীতে থাকা উচিত, কারণ in এর অগ্রাধিকার + এর চেয়ে কম।
পাইথন ২-এ, অনেক অভিধান পদ্ধতির রিটার্ন মান হল তালিকা। সবচেয়ে বেশি ব্যবহৃত পদ্ধতির মধ্যে রয়েছে keys,items এবং values। পাইথন ৩-এ, উপরের সমস্ত পদ্ধতির রিটার্ন মান পরিবর্তন করা হয়েছে dynamic view-এ। কিছু প্রসঙ্গের পরিবেশে, এই পরিবর্তনটি প্রভাব ফেলবে না। যদি এই পদ্ধতিগুলির রিটার্ন মানগুলি অবিলম্বে অন্য একটি ফাংশনকে দেওয়া হয় এবং সেই ফাংশনটি পুরো ক্রমটি অতিক্রম করে, তবে উপরের পদ্ধতির রিটার্ন মান হল তালিকা বা দৃশ্য এবং কোনও পার্থক্য হবে না। অন্য ক্ষেত্রে, পাইথন ৩-এর এই পরিবর্তনগুলি গুরুত্বপূর্ণ। আপনি যদি একটি তালিকা আশা করেন যা স্বাধীনভাবে পয়েন্ট করা যায়, তবে পাইথন ৩-এর এই পরিবর্তনগুলি আপনার কোড কার্ডকে আটকে দেবে, কারণ view-টি সূচীবদ্ধকরণ সমর্থন করে না।
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 |
১। list () ফাংশন ব্যবহার করে keys () এর রিটার্ন ভ্যালুকে একটি স্ট্যাটিক তালিকায় রূপান্তর করা হয়। নিরাপত্তার জন্য, 2to3 সম্ভবত ভুল করে। এই ধরনের কোড কার্যকর, তবে ভিউ ব্যবহারের জন্য এটি কিছুটা কম দক্ষ। আপনি অবশ্যই তালিকাটি প্রয়োজন কিনা তা দেখার জন্য রূপান্তরিত কোডটি পরীক্ষা করা উচিত, সম্ভবত ভিউও একই কাজ করতে পারে। ২, এটি অন্য একটি দৃশ্য, যা [[items]] পদ্ধতির [[conversion]]কে [[list]]তে রূপান্তরিত করে। ২-টু-৩ জোড়া [[values]] পদ্ধতির [[value]] ফেরত দেওয়ার ক্ষেত্রেও একই রকম। ৩, পাইথন ৩ তে আর iterkeys ((() সাপোর্ট করে না। প্রয়োজন হলে, iter ((() ব্যবহার করে keys ((() এর রিটার্ন মানকে একটি iterator এ রূপান্তর করুন। ৪, ২-টু-৩ এর সাহায্যে, iterkeys () পদ্ধতিকে তালিকা বিশ্লেষণে ব্যবহার করা যেতে পারে এবং এটিকে পাইথন ৩ এর keys () পদ্ধতিতে রূপান্তর করা যেতে পারে। এর জন্য অতিরিক্ত iter () ব্যবহার করার প্রয়োজন নেই। এটি কার্যকর কারণ ভিউটি পুনরাবৃত্তিমূলক। ৫, ২-৩-এও দেখা যায় যে keys ((() পদ্ধতির রিটার্ন অবিলম্বে অন্য ফাংশনে প্রেরণ করা হয় যা পুরো ক্রমটি অতিক্রম করে, তাই keys ((() এর রিটার্নকে প্রথমে একটি তালিকায় রূপান্তর করার দরকার নেই। বিপরীতে, min ((() ফাংশনটি দৃশ্যটি অতিক্রম করতে খুশি হবে। এই প্রক্রিয়াটি min (((), max (((), sum (((), list (((), tuple (((), set (((), sorted (((), any ((() এবং all (()) এর জন্যও কার্যকর।
পাইথন ২ থেকে পাইথন ৩ পর্যন্ত, স্ট্যান্ডার্ড কুরির কিছু মডিউল নামকরণ করা হয়েছে। কিছু সম্পর্কিত মডিউলকে একত্রিত বা পুনর্গঠিত করা হয়েছে যাতে এই সম্পর্ক আরও যৌক্তিক হয়।
Notes | Python 2 | Python 3 |
---|---|---|
① | import httplib | import http.client |
② | import Cookie | import http.cookies |
③ | import cookielib | import http.cookiejar |
④ | import BaseHTTPServer import SimpleHTTPServer import CGIHttpServer |
import http.server |
http.client মডিউলটি একটি অন্তর্নিহিত লাইব্রেরি বাস্তবায়ন করে যা HTTP রিসোর্সগুলির জন্য অনুরোধ করতে এবং HTTP প্রতিক্রিয়াগুলি পার্স করতে ব্যবহার করা যেতে পারে। http.cookies মডিউলটি HTTP হেডার (HTTP header) Set-Cookie এর মাধ্যমে প্রেরিত কুকিজ পাওয়ার জন্য একটি পাইথোনিক ইন্টারফেস সরবরাহ করে সাধারণ ব্রাউজারগুলি কুকিজকে ফাইল হিসাবে ডিস্কে সংরক্ষণ করে, এবং http.cookiejar মডিউল এই ফাইলগুলি পরিচালনা করতে পারে। http.server মডিউল একটি মৌলিক HTTP সার্ভার বাস্তবায়ন করে
Notes | Python 2 | Python 3 |
---|---|---|
① | import urllib | import urllib.request urllib.parse,urllib.error |
② | import urllib2 | import urllib.request urllib.error |
③ | import urlparse | import urllib.parse |
④ | import robotparser | import urllib.robotparser |
⑤ | from urllib import FancyURLopener from urllib import urlencode |
from urllib.request import FancyURLopener from urllib.parse import urlencode |
⑥ | from urllib2 import Request from urllib2 import HTTPError |
from urllib.request import Request from urllib.error import HTTPError |
পূর্বে, পাইথন ২-এর urllib মডিউলটিতে বিভিন্ন ফাংশন ছিল, যার মধ্যে রয়েছে urlopen () যা ডেটা সংগ্রহের জন্য ব্যবহৃত হয়, এবং এটি ইউআরএলকে তার উপাদানগুলিতে বিভক্ত করার জন্যও কার্যকর ছিল splitype ()), splithost () এবং splituser () ফাংশন। নতুন urllib প্যাকেজে, এই ফাংশনগুলি আরও যৌক্তিকভাবে সংগঠিত হয়েছে। 2to3 এই ফাংশনগুলির কলগুলিকে নতুন নামকরণের সাথে খাপ খাইয়ে নিতে সংশোধন করবে। পাইথন ৩ তে, পূর্ববর্তী urllib2 মডিউলগুলি urllib প্যাকেজে সংযুক্ত করা হয়েছে। একই সময়ে, আপনার প্রিয় কিছু urllib2 এর মধ্যে একটি অনুপস্থিত urllib মডিউল পাইথন ৩ তে উপস্থিত হবে, যেমন build_opener () পদ্ধতি, Request object, HTTPBasicAuthHandler এবং friends。 পাইথন ৩ এর urllib.parse মডিউলটিতে মূল পাইথন ২ এর urlparse মডিউলের সমস্ত পার্সার ফাংশন রয়েছে। urllib.robotparse মডিউলটি robots.txt ফাইলটি পার্স করে। FancyURLopener ক্লাস, যা HTTP পুনর্নির্দেশ এবং অন্যান্য স্ট্যাটাস কোড পরিচালনা করে, এখনও পাইথন 3 এর urllib.request মডিউলে কার্যকর রয়েছে। urlencode () ফাংশনটি urllib.parse এ স্থানান্তরিত হয়েছে। Request অবজেক্ট urllib.request এ কাজ করে, কিন্তু HTTPError এর মত ধ্রুবকগুলো urllib.error এ স্থানান্তরিত হয়েছে। আমি কি উল্লেখ করেছি যে 2to3 আপনার ফাংশন কলগুলিও পুনর্লিখন করবে? উদাহরণস্বরূপ, যদি আপনার পাইথন 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 print(urllib.request.urlopen(’http://diveintopython3.org/‘).read()) |
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 import whichdb |
import dbm |
Notes | Python 2 | Python 3 |
---|---|---|
① | import xmlrpclib | import xmlrpc.client |
② | import DocXMLRPCServer import SimpleXMLRPCServer |
import xmlrpc.server |
Notes | Python 2 | Python 3 |
---|---|---|
① | try: import cStringIO as StringIO except ImportError: import StringIO |
import io |
② | try: import cPickle as pickle except ImportError: 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 মডিউলটি আপনাকে এই কাজটি করতে সাহায্য করবে। এটি উপলব্ধ দ্রুততম বাস্তবায়ন পদ্ধতি খুঁজে বের করবে এবং এটি স্বয়ংক্রিয়ভাবে ব্যবহার করবে। ২। পাইথন ২ তে, দ্রুততম পিকল বাস্তবায়ন আমদানি করাও উপরের মতই একটি কার্যকর পদ্ধতি। পাইথন ৩ তে, পিকল মডিউলটি স্বয়ংক্রিয়ভাবে আপনার জন্য এটি পরিচালনা করে, তাই আর এটি করবেন না। ৩. builtins মডিউল গ্লোবাল ফাংশন, ক্লাস এবং ধ্রুবক ধারণ করে যা পুরো পাইথন ভাষায় ব্যবহৃত হয়। Builtins মডিউলের একটি ফাংশন পুনরায় সংজ্ঞায়িত করা মানে এই গ্লোবাল ফাংশনটি সর্বত্র পুনরায় সংজ্ঞায়িত করা। এটি শক্তিশালী শোনাচ্ছে, তবে একই সাথে ভয়ঙ্করও। ৪। copyreg মডিউলটি C ভাষায় সংজ্ঞায়িত ব্যবহারকারীর কাস্টমাইজড প্রকারের জন্য pickle মডিউলটির সমর্থন যোগ করেছে। ৫। ক্যু মডিউল একটি প্রযোজক-ভোক্তা ক্যু (মাল্টি-প্রযোজক, মাল্টি-গ্রাহক ক্যু) বাস্তবায়ন করে। ৬। সকেট সার্ভার মডিউলটি বিভিন্ন সকেট সার্ভার বাস্তবায়নের জন্য সাধারণ মৌলিক শ্রেণি সরবরাহ করে। ৭। কনফিগারারার মডিউলটি আইএনআই-স্টাইল কনফিগারেশন ফাইলগুলিকে বিশ্লেষণ করতে ব্যবহৃত হয়। ৮, reprlib মডিউলটি বিল্ট-ইন ফাংশন repr () পুনরায় বাস্তবায়ন করে এবং স্ট্রিংয়ের দৈর্ঘ্য নিয়ন্ত্রণ করে যে এটি বন্ধ হওয়ার আগে নির্দেশিত হয়। 9। subprocess মডিউল আপনাকে একটি সাবপ্রসেস তৈরি করতে দেয়, তাদের পাইপলাইনের সাথে সংযুক্ত করে এবং তাদের রিটার্নের মানগুলি গ্রহণ করে।
একটি প্যাকেজ হল একটি একক সত্তা যা একটি সম্পর্কিত মডিউল দ্বারা গঠিত। পাইথন ২ তে, একই প্যাকেজের মডিউলগুলির জন্য পারস্পরিক রেফারেন্সের জন্য, আপনি আমদানি foo বা from foo import Bar ব্যবহার করবেন। পাইথন ২ এর ব্যাখ্যাকারী প্রথমে বর্তমান ডিরেক্টরিতে foo.py অনুসন্ধান করবে, তারপরে পাইথন অনুসন্ধান পাথ ((sys.path) এ অনুসন্ধান করবে। পাইথন ৩ এ এই প্রক্রিয়াটি কিছুটা আলাদা। পাইথন ৩ প্রথমে বর্তমান পাথটি অনুসন্ধান করবে না, এটি সরাসরি পাইথনের অনুসন্ধান পাথের মধ্যে অনুসন্ধান করবে। যদি আপনি প্যাকেজের অন্য মডিউলকে একটি প্যাকেজের মডিউল থেকে আমদানি করতে চান তবে আপনাকে স্পষ্টতই দুটি মডিউলের আপেক্ষিক পথ সরবরাহ করতে হবে।
ধরুন, আপনার কাছে একই ডিরেক্টরিতে একাধিক ফাইল রয়েছে, যেমনঃ
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) অথবা একটি উপ-ডিরেক্টরি। ২। একটি নির্দিষ্ট ক্লাস বা ফাংশন অন্য মডিউল থেকে সরাসরি আপনার মডিউল নামস্থান থেকে আমদানি করার জন্য, আমদানি করা প্রয়োজন এমন মডিউল নামের সাথে আপেক্ষিক পাথ যুক্ত করুন এবং শেষ স্ল্যাশটি সরিয়ে দিন ((slash) । এই উদাহরণে, mbcharsetprober.py এবং universaldetector.py একই ডিরেক্টরিতে রয়েছে, তাই আপেক্ষিক পাথের নামটি একটি বাক্য। আপনি পিতা-মাতা ডিরেক্টরি ((from .. import anothermodule) বা একটি উপ-ডিরেক্টরি থেকেও আমদানি করতে পারেন।
পাইথন ২-এ, ইটোরেটরটির একটি next () পদ্ধতি রয়েছে যা ক্রমের পরবর্তী পদটি ফেরত দেয়। এটি পাইথন ৩-এও কাজ করে, তবে এখন একটি নতুন গ্লোবাল ফাংশন next () রয়েছে যা একটি ইটোরেটরকে প্যারামিটার হিসাবে ব্যবহার করে।
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:
def next(self):
pass|class A:
def next(self):
pass|
|④|class A:
def next(self, x, y):
pass|no change |
|⑤|next = 42
for an_iterator in a_sequence_of_iterators:
an_iterator.next()|next = 42
for an_iterator in a_sequence_of_iterators:
aniterator.next() |
1, সহজতম উদাহরণ, আপনি আর একটি ইটোরেটর এর next (() পদ্ধতি কল করবেন না, এখন আপনি ইটোরেটর নিজেই একটি প্যারামিটার হিসাবে গ্লোবাল ফাংশন next ((() তে পাস করবেন।
২, যদি আপনার কাছে একটি ফাংশন থাকে যার রিটার্ন মান হল একটি ইডিয়েটর, তবে এই ফাংশনটি কল করুন এবং ফলাফলটি next () ফাংশনকে প্যারামিটার হিসাবে পাস করুন।
তৃতীয়ত, আপনি যদি আপনার নিজস্ব ক্লাসটি সংজ্ঞায়িত করেন এবং এটিকে একটি ইরেক্টর হিসাবে ব্যবহার করেন, পাইথন 3 এ, আপনি একটি বিশেষ পদ্ধতি সংজ্ঞায়িত করে__next(পরের সংবাদ)
৪, যদি আপনার সংজ্ঞায়িত শ্রেণীর মধ্যে একটি next () থাকে, যা এক বা একাধিক প্যারামিটার ব্যবহার করে, 2to3 কার্যকর করার সময় এটিকে সরানো হবে না। এই শ্রেণীটি একটি iterator হিসাবে ব্যবহার করা যাবে না, কারণ এর next () পদ্ধতিতে প্যারামিটার রয়েছে।
৫, এটা একটু জটিল। আপনি যদি একটি স্থানীয় ভেরিয়েবলের নাম next রাখেন, তাহলে Python 3 এ এর অগ্রাধিকার হবে global function next ((() এর চেয়ে বেশি। এই ক্ষেত্রে, আপনাকে একটি বিশেষ পদ্ধতিতে iterator কল করতে হবে।next() ক্রমের পরবর্তী উপাদানটি পেতে。(অথবা, আপনি কোডটি পুনর্গঠন করতে পারেন যাতে এই স্থানীয় পরিবর্তনশীলটির নাম next না হয়, কিন্তু 2to3 আপনার জন্য এটি করবে না。)
পাইথন ২ এ, filter() পদ্ধতি একটি তালিকা প্রদান করে যা একটি ফাংশন দ্বারা প্রাপ্ত হয় যা সত্য বা মিথ্যা হিসাবে প্রত্যাবর্তন করে। পাইথন ৩ এ, filter() ফাংশনটি একটি ইরেক্টর ফেরত দেয়, এটি আর তালিকা নয়।
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 একটি list () ফাংশন ব্যবহার করে filter () প্যাকেজ করে, এবং list () ফাংশন তার প্যারামিটারগুলি অতিক্রম করে এবং একটি তালিকা ফেরত দেয়। ২, যাইহোক, যদি filter() কলটি list() প্যাকেজে থাকে, তাহলে 2to3 আর কাজ করবে না, কারণ এই ক্ষেত্রে filter() এর রিটার্ন মানটি একটি iterator কিনা তা গুরুত্বপূর্ণ নয়। 3। Filter ((None, …) এর এই বিশেষ ব্যাকরণটি মোকাবেলা করার জন্য, 2to3 এই কলটিকে ব্যাকরণগতভাবে সমতুল্য থেকে তালিকা বিশ্লেষণে রূপান্তর করবে। ৪। যেহেতু for loop পুরো ক্রম জুড়ে চলে, তাই আর কোন পরিবর্তন করার প্রয়োজন নেই। ৫. উপরের মতই, কোন পরিবর্তন করার প্রয়োজন নেই, কারণ তালিকা পার্সারিং পুরো ক্রম জুড়ে চলে, এমনকি যদি filter ((() একটি iterator ফেরত দেয়, তবে এটি আগের filter ((() return list মতই কাজ করবে।
ফিল্টার () এর পরিবর্তনের মতো, 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 |
১, ফিল্টার (), 2to3 এর সাথে একইভাবে ব্যবহার করা হয়। সবচেয়ে সহজ ক্ষেত্রে, 2to3 একটি list () ফাংশন ব্যবহার করে map () কলটি প্যাকেজ করে। ২। একটি বিশেষ map ((None, …) বানানের জন্য, filter ((None, …) এর মত, 2to3 এটিকে একটি list (() এর সমতুল্য কল হিসাবে রূপান্তর করবে। ৩, map (,) এর প্রথম প্যারামিটারটি যদি একটি lambda ফাংশন হয়, 2to3 এটিকে সমতুল্যভাবে তালিকা পার্সেলিংয়ে রূপান্তর করবে। ৪। For loop এর জন্য কোন পরিবর্তন করার প্রয়োজন নেই, যা পুরো ক্রম জুড়ে চলে। ৫, আবার, এখানে কোন পরিবর্তন করার প্রয়োজন নেই, কারণ তালিকা পার্সারিং পুরো ক্রম জুড়ে চলে, এমনকি map () এর রিটার্ন মানটি তালিকা নয় বরং একটি ইন্ডেক্স হলেও এটি সঠিকভাবে কাজ করবে।
পাইথন ৩-এ, reduce ((() ফাংশনটি গ্লোবাল নামস্থান থেকে সরিয়ে ফেলা হয়েছে এবং এটি এখন fucntools মডিউলে রাখা হয়েছে।
Notes | Python 2 | Python 3 |
---|---|---|
① | reduce(a, b, c) | from functools import reduce reduce(a, b, c) |
পাইথন ২ এর একটি গ্লোবাল ফাংশন আছে যার নাম apply (), এটি একটি ফাংশন f এবং একটি তালিকা ব্যবহার করে[a, b, c] একটি প্যারামিটার হিসাবে, f ((a, b, c) । আপনি এই ফাংশনটি সরাসরি কল করে তালিকাটির আগে একটি তারকাচিহ্ন যুক্ত করতে পারেন।*) একটি প্যারামিটার হিসেবে পাস করা হয় যাতে এটি একই কাজ করতে পারে। পাইথন ৩-এ, 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] এর মত) ফাংশনটি কল করার আগে একটি তারকাচিহ্ন যুক্ত করুন। এটি পাইথন ২ এর apply () ফাংশনের সমতুল্য। ২, পাইথন ২ এ, apply ((() ফাংশনটি আসলে ৩ টি প্যারামিটার বহন করতে পারেঃ একটি ফাংশন, একটি প্যারামিটার তালিকা, একটি অভিধান নামকরণ প্যারামিটার (((dictionary of named arguments)) । পাইথন ৩ এ, আপনি প্যারামিটার তালিকার আগে একটি তারকাচিহ্ন যুক্ত করে (((), অভিধানের নামকরণের পরামিতিগুলির আগে দুটি তারকাচিহ্ন যুক্ত করুন ((**) একই রকম প্রভাব ফেলতে পারে। ৩, অপারেটর + এখানে লিঙ্কযুক্ত তালিকার ফাংশন হিসাবে ব্যবহৃত হয়, এটি অপারেটরের চেয়ে বেশি অগ্রাধিকার পায়, সুতরাং a_list_of_args + z এর চারপাশে অতিরিক্ত বন্ধনী যুক্ত করার প্রয়োজন নেই। ৪, ২-টু-৩ স্ক্রিপ্টটি জটিল apply () কলগুলি রূপান্তর করার জন্য যথেষ্ট বুদ্ধিমান, যার মধ্যে আমদানি মডিউলের ফাংশনগুলি অন্তর্ভুক্ত রয়েছে।
পাইথন ২ এ, আপনি একটি স্ট্রিংয়ের উপর inter () ফাংশন ব্যবহার করে এটিকে সীমাবদ্ধ করতে পারেন যাতে এটি পারফরম্যান্স অপ্টিমাইজেশান অর্জন করতে পারে। পাইথন ৩ এ, inter () ফাংশনটি sys মডিউলে স্থানান্তরিত হয়েছে।
Notes | Python 2 | Python 3 |
---|---|---|
① | intern(aString) | sys.intern(aString) |
যেভাবে print স্টেটমেন্ট পাইথন ৩ তে একটি ফাংশন হয়ে যায়, তেমনিভাবে 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)| ১। সহজতম আকারে, যেহেতু exec ((() এখন একটি ফাংশন, একটি স্টেটমেন্ট নয়, 2to3 এই স্ট্রিং আকা