পাইথনে, দুটি ধরনের আর্গুমেন্ট থাকে: পজিশনাল এবং কিওয়ার্ড আর্গুমেন্ট। এই আর্গুমেন্টগুলো একটি নির্দিষ্ট ক্রমে থাকতে হবে অন্যথায় পাইথন ইন্টারপ্রেটার একটি এরর রিটার্ন করে।
এই গাইডে, আমরা "positional argument follows keyword argument" এরর এবং কেন এটি উঠে সেটি আলোচনা করব। আমরা এই এররসহ একটি উদাহরণ কোড স্নিপেট দেখব যাতে আমরা কীভাবে এটি সমাধান করব সেটি ওয়াকথ্রু করতে পারি।
চলুন শুরু করি!
সমস্যাটি: positional argument follows keyword argument
আমাদের পূর্ণ এররটি দেখি:
SyntaxError: positional argument follows keyword argument
ইংরেজি ভাষার মতো, প্রোগ্রামিং ভাষারও নিজস্ব নিয়ম থাকে। এই নিয়মগুলোকে সিনট্যাক্স বলা হয়। আমাদের এরর একটি সিনট্যাক্স এরর যা বোঝায় আমরা পাইথন কোড লেখার নিয়ন্ত্রণকারী নিয়মগুলোর একটি ফলো করিনি।
এররটির পরবর্তী অংশ আমাদের বলে দেয় কী এই এররটিকে কারণ হয়ছে। এই কেসে, আমাদের কোডে অবশ্যই একটি পজিশনাল আর্গুমেন্ট থাকছে যেটি একটি কিওয়ার্ড আর্গুমেন্টের পর আসছে।
পজিশনাল আর্গুমেন্ট হল যেসব আর্গুমেন্ট তাদের রেসপেক্টিভ পজিশনে থাকে:
def add_numbers(a, b):
return a + b
Let's call this function:
add_numbers(2, 3)
"a" এবং "b" আমাদের ফাংশনের ভিতরে ভেরিয়েবল হয়ে যায়। এই কোড কাজ করে কারণ আমরা দুটি পজিশনাল আর্গুমেন্ট স্পেসিফাই করেছি। "a" ২-এর সমান এবং "b" তিনের সমান। আমরা এই আর্গুমেন্টগুলো কিওয়ার্ড আর্গুমেন্ট হিসেবেও স্পেসিফাই করতে পারি:
add_numbers(a=2, b=2)
যাইহোক, আমরা একটি পজিশনাল আর্গুমেন্ট প্রথমে স্পেসিফাই করে তারপর কিওয়ার্ড সিনট্যাক্সে স্যুইচ করতে পারি না।
এটি কারণ পাইথনে একটি স্পেশাল ফাংশন আছে *args যা একটি ফাংশনে একাধিক আর্গুমেন্ট প্রসেস করে। এই কোডটি বিবেচনা করুন:
def show_users(a, b, *args):
print(a, b, *args)
এই কোডটি *args ব্যবহার করে। এই কিওয়ার্ড একটি ভেরিয়েবল সংখ্যক আর্গুমেন্ট রিপ্রেজেন্ট করে। আমরা আমাদের show_users() ফাংশনে যতক্ষণ চাই ততক্ষণ আর্গুমেন্ট পাস করতে পারি:
show_users("Alex", "Peter", "Violet', "Julie")
আমাদের কোড রিটার্ন করে: Alex Peter Violet Julie
আমাদের প্রথম দুটি আর্গুমেন্ট, "a" এবং "b", যথাক্রমে "Alex" এবং "Peter" ভ্যালু পায়।
এটি কারণ যদি আপনি পজিশনাল সিনট্যাক্স ব্যবহার করেন, আর্গুমেন্টগুলো 그들이 পাস করা আর্ডারে অ্যাসাইন হয়। লাস্ট আর্গুমেন্টগুলো 그들이 স্টেট করা আর্ডারে থাকে কারণ *args একটি অজানা পরিমাণের অ্যাডিশনাল আর্গুমেন্ট রিপ্রেজেন্ট করে।
একটি উদাহরণ সিনেরিও
চলুন একটি কোড স্নিপেট দেখি যা এই এররটি অনুভব করে:
def print_menu(salads, pizzas):
print("Salad Menu")
for s in salads:
print(s)
print("")
print("Pizza Menu")
for p in pizzas:
print(p)
এই ফাংশনটি দুটি আর্গুমেন্ট এক্সেপ্ট করে: salads এবং pizzas। আমাদের ফাংশন স্যালাড মেনুতে প্রতিটি স্যালাড এবং পিজা মেনুতে প্রতিটি পিজা কনসোলে প্রিন্ট আউট করে।
চলুন আমাদের ফাংশন কল করি:
salads = ["Tuna Salad", "Lettuce and Mango Salad", "Greek Salad"] pizzas = ["Veggie Supreme", "Ham and Pineapple", "BBQ Chicken"] print_menu(pizzas=pizzas, salads)
আমাদের কোড রিটার্ন করে:
File "main.py", line 13 print_menu(pizzas=pizzas, salads) ^ SyntaxError: positional argument follows keyword argument
আমাদের কোডে একটি এরর আছে, যেমন আমরা আশা করছিলাম। চলুন এটিকে ফিক্স করি।
সমাধান
এই সমস্যাটি সমাধান করতে, আমাদের নিশ্চিত করতে হবে যে সকল পজিশনাল আর্গুমেন্ট কিওয়ার্ড আর্গুমেন্টের আগে আসে। চলুন আমরা আমাদের ফাংশন কল করার পদ্ধতি পরিবর্তন করি এই নিয়মটি রিফলেক্ট করতে:
print_menu(salads, pizzas)
আমরা দুটি পজিশনাল আর্গুমেন্ট স্পেসিফাই করেছি: salads এবং pizzas। বিকল্পভাবে, আমরা "pizzas" কে "salads"-এর পর একটি কিওয়ার্ড আর্গুমেন্ট হিসেবে স্পেসিফাই করতে পারি:
print_menu(salads, pizzas = pizzas)
এই উদাহরণে, যেহেতু আমরা *args মেথড ব্যবহার করছি না, কোনো কিওয়ার্ড আর্গুমেন্ট যোগ করা অপ্রয়োজনীয়।そう言うと, কিওয়ার্ড আর্গুমেন্ট যোগ করা কোডকে আরও পঠনযোগ্য করে তুলতে পারে ফাংশনে পাস করা ভ্যালুর সংখ্যার উপর নির্ভর করে।
চলুন এই রিভাইজড ফাংশন কল দিয়ে আমাদের কোড রান করি:
Salad Menu Tuna Salad Lettuce and Mango Salad Greek Salad Pizza Menu Veggie Supreme Ham and Pineapple BBQ Chicken
আমাদের কোড সফলভাবে আমাদের দুটি পাইথন লিস্ট প্রিন্ট আউট করল।
উপসংহার
পাইথনে পজিশনাল আর্গুমেন্টগুলো কিওয়ার্ড আর্গুমেন্টের আগে আসতে হবে। এর কারণ হল পাইথন পজিশনাল আর্গুমেন্টগুলো 그들이 উপস্থিত আর্ডারে ইন্টারপ্রেট করে। তারপর, এটি স্পেসিফাই করা কিওয়ার্ড আর্গুমেন্টগুলো ইন্টারপ্রেট করে।
এখন আপনি "positional argument follows keyword argument" এররটি এক্সপার্ট পাইথন ডেভেলপারের মতো সমাধান করার জন্য রেডি!