+=
পাইথন ২.০-তে "অগমেন্টেড" এসাইনমেন্ট অপারেটরগুলি প্রবর্তিত হয়েছিল, যা ২০০০ সালের অক্টোবরে প্রকাশিত হয়েছিল। ডিজাইন এবং যুক্তিগুলি পিইপি ২০৩-এ বর্ণনা করা হয়েছে । এই অপারেটরগুলির ঘোষিত লক্ষ্যগুলির একটি হ'ল ইন-প্লেস অপারেশনগুলির সমর্থন। লেখা
a = [1, 2, 3]
a += [4, 5, 6]
a
জায়গাটি তালিকায় আপডেট করার কথা । তালিকার অন্যান্য উল্লেখ রয়েছে তবে এটি গুরুত্বপূর্ণ a
, যেমন a
ফাংশন আর্গুমেন্ট হিসাবে কখন প্রাপ্ত হয়েছিল।
যাইহোক, অপারেশনটি সর্বদা স্থানে হতে পারে না, যেহেতু পূর্ণসংখ্যা এবং স্ট্রিং সহ পাইথনের অনেক ধরণ অপরিবর্তনীয় , সুতরাং উদাহরণস্বরূপ i += 1
কোনও পূর্ণসংখ্যার জন্য i
সম্ভবত জায়গায় কাজ করা যায় না।
সংক্ষেপে, অগমেন্টেড অ্যাসাইনমেন্ট অপারেটররা যখন সম্ভব হবে তখন জায়গায় কাজ করবে এবং অন্যথায় একটি নতুন অবজেক্ট তৈরি করার কথা ছিল। এই নকশা লক্ষ্যগুলি সুবিধার জন্য, প্রকাশটি নীচের x += y
মতো আচরণের জন্য নির্দিষ্ট করা হয়েছিল:
- যদি
x.__iadd__
সংজ্ঞায়িত x.__iadd__(y)
হয় তবে মূল্যায়ন করা হয়।
- অন্যথায়,
x.__add__
বাস্তবায়িত হলে x.__add__(y)
মূল্যায়ন করা হয়।
- অন্যথায়,
y.__radd__
বাস্তবায়িত হলে y.__radd__(x)
মূল্যায়ন করা হয়।
- অন্যথায় একটি ত্রুটি উত্থাপন।
এই প্রক্রিয়াটির দ্বারা প্রাপ্ত প্রথম ফলাফলটি আবার বরাদ্দ করা হবে x
(যদি না ফলাফলটি NotImplemented
সিঙ্গলটন না হয় তবে সেক্ষেত্রে পরবর্তী পদক্ষেপের সাথে অনুসন্ধান অব্যাহত থাকে)।
এই প্রক্রিয়া ধরনের যে সমর্থনে জায়গা পরিবর্তন বাস্তবায়ন করতে পারবেন __iadd__()
। প্রকারভেদ যে না ইন-জায়গা পরিবর্তন সমর্থন কোনো নতুন জাদু পদ্ধতি যোগ করার জন্য, যেহেতু পাইথন স্বয়ংক্রিয়ভাবে মূলত ফিরে আসবে প্রয়োজন হবে না x = x + y
।
সুতরাং আসুন শেষ পর্যন্ত আসুন আপনার আসল প্রশ্নে - আপনি কেন একটি বর্ধিত অ্যাসাইনমেন্ট অপারেটরের সাথে তালিকায় একটি টিপল যুক্ত করতে পারেন। স্মৃতি থেকে, এর ইতিহাস মোটামুটি এর মত: list.__iadd__()
পদ্ধতিটি ইতিমধ্যে list.extend()
পাইথন ২.০ এ ইতিমধ্যে বিদ্যমান পদ্ধতিটি কল করার জন্য প্রয়োগ করা হয়েছিল । পাইথন ২.১-এ পুনরাবৃত্তি চালু করা হলে list.extend()
নির্বিচারে পুনরাবৃত্তিকে গ্রহণ করার পদ্ধতিটি আপডেট করা হয়েছিল। এই পরিবর্তনগুলির শেষ ফলাফলটি my_list += my_tuple
পাইথন ২.১ থেকে শুরু করে কাজ করেছিল। list.__add__()
পদ্ধতি, কিন্তু, ডানদিকের আর্গুমেন্ট হিসাবে নির্বিচারে iterators সমর্থন করার জন্য কথা ছিল না - এই শক্তিশালী ভাবে টাইপ ভাষার জন্য অনুপযুক্ত বিবেচিত ছিল।
আমি ব্যক্তিগতভাবে মনে করি অগমেন্টেড অপারেটরগুলির বাস্তবায়ন পাইথনে কিছুটা জটিল হয়ে গিয়েছিল। এর অনেকগুলি আশ্চর্যজনক পার্শ্ব প্রতিক্রিয়া রয়েছে, যেমন এই কোড:
t = ([42], [43])
t[0] += [44]
দ্বিতীয় লাইনটি উত্থাপিত হয় TypeError: 'tuple' object does not support item assignment
, তবে অপারেশনটি যেভাবেই সফলভাবে সম্পাদিত হয় - ত্রুটি উত্থাপনকারী লাইনটি কার্যকর করার পরে t
হবে ([42, 44], [43])
।