ডিফল্ট যুক্তিগুলি ডিফল্ট যুক্তিগুলি অনুসরণ করতে পারে না কেন?


137

এই কোডের টুকরা কেন একটি সিনট্যাক্সেরর ফেলে দেয়?

  >>> def fun1(a="who is you", b="True", x, y):
...     print a,b,x,y
... 
  File "<stdin>", line 1
SyntaxError: non-default argument follows default argument

নিম্নলিখিত কোডের টুকরা দৃশ্যমান ত্রুটিগুলি ছাড়াই চলতে থাকে:

>>> def fun1(x, y, a="who is you", b="True"):
...     print a,b,x,y
... 

অজগরের কাঠামোটি এমন হয় যখন আপনি কোনও ফাংশন সংজ্ঞায়িত করেন def myfunction(position_arguments, *arguments, **keywords):`....`
অভিষেকগারগ

উত্তর:


172

সমস্ত প্রয়োজনীয় প্যারামিটার অবশ্যই কোনও ডিফল্ট আর্গুমেন্টের আগে স্থাপন করা উচিত। কেবলমাত্র এগুলি বাধ্যতামূলক, কারণ ডিফল্ট আর্গুমেন্টগুলি তা নয়। কৃত্রিমভাবে, দোভাষী পক্ষে সিদ্ধান্ত নেওয়া অসম্ভব যে কোনও মিশ্র মোডের অনুমতি দেওয়া হলে কোন যুক্তিগুলির সাথে কোন মান মেলে। SyntaxErrorআর্গুমেন্টগুলি সঠিক ক্রমে না দেওয়া থাকলে A উত্থাপিত হয়:

আসুন আপনার ফাংশনটি ব্যবহার করে কীওয়ার্ড আর্গুমেন্টগুলি একবার দেখুন।

def fun1(a="who is you", b="True", x, y):
...     print a,b,x,y

মনে করুন যে এটির উপরের মতো ফাংশন ঘোষণা করার অনুমতি দেওয়া হয়েছে, তারপরে উপরোক্ত ঘোষণার সাহায্যে আমরা নিম্নলিখিত (নিয়মিত) অবস্থানিক বা কীওয়ার্ড আর্গুমেন্ট কল করতে পারি:

func1("ok a", "ok b", 1)  # Is 1 assigned to x or ?
func1(1)                  # Is 1 assigned to a or ?
func1(1, 2)               # ?

কীভাবে আপনি ফাংশন কলটিতে ভেরিয়েবলের অ্যাসাইনমেন্টের পরামর্শ দেবেন, কীওয়ার্ড আর্গুমেন্টের সাথে ডিফল্ট আর্গুমেন্টগুলি কীভাবে ব্যবহৃত হবে।

>>> def fun1(x, y, a="who is you", b="True"):
...     print a,b,x,y
... 

রেফারেন্স ও'রিলি - কোর পাইথন
যেখানে এই ফাংশনটি উপরের ফাংশন কলগুলির জন্য সিন্থেটিকভাবে ডিফল্ট যুক্তিগুলি ব্যবহার করে use মূলশব্দ আর্গুমেন্টগুলি আউট-অফ-অর্ডার অবস্থানগত আর্গুমেন্ট সরবরাহ করতে সক্ষম হওয়ার জন্য দরকারী প্রমাণিত হয়, তবে, ডিফল্ট যুক্তিগুলির সাথে মিলিয়ে, সেগুলি অনুপস্থিত আর্গুমেন্টগুলি "স্কিপ ওভার" করতেও ব্যবহৃত হতে পারে।


3
<<> সিন্ট্যাক্টিক্যালি, দোভাষীর পক্ষে এটি নির্ধারণ করা অসম্ভব যে কোনও মিশ্রিত মোডের অনুমতি দেওয়া হলে কোন যুক্তিগুলির সাথে কোন মানগুলি মিলে। </ strong> রুবি ডিফল্ট অনুসারে অ-ডিফল্ট যুক্তিগুলিকে মঞ্জুরি দেয়। <q> আপনি কীভাবে ফাংশন কলটিতে ভেরিয়েবলের অ্যাসাইনমেন্টের পরামর্শ দিবেন </ strong> স্রেফ ব্যবহার করুন func1(x=1, y=2)
দুর্বল করুন

হাই @ ওয়াকিশ, মন্তব্যের জন্য ধন্যবাদ, পাইথনের এটি অর্জনের একটি দুর্দান্ত উপায় আছে, দয়া করে * আরগস এবং ** কাওয়ার্গগুলি অনুসন্ধান করুন
রাহুল গৌতম

হাই @ রাহুল গৌতম আমি বিভ্রান্ত আমি ভেবেছিলাম **kwargsনা করতে def fun1(a="who is you", b="True", x, y)বা অনুরূপ কাজ করতে পারেন । আপনি যদি ব্যবহার def f(**kwargs)করেন তবে আপনার শরীরে ডিফল্ট মানগুলি হ্যান্ডেল করা দরকার?
দুর্বল করুন

@ def fun1(a="who is you", b="True", x, y)একই জিনিসটি ভিন্ন স্টাইলে অর্জন করা উচিত যদি ডিফ ফান 1 (** কেওআরএস) `তবে fun1({'a': 'who is you', 'b': True})এক্স এবং ওয়াই পাস করার দরকার নেই।
রাহুল গৌতম

1
আপনি কেন "সিনট্যাক্টিকালি, দোভাষীর পক্ষে সিদ্ধান্ত নেওয়া অসম্ভব যে কোন মানগুলি মিশ্র মোডের অনুমতি দেওয়া হলে কোন যুক্তিগুলির সাথে মিলে যায়?" আমি মনে করি যে পিইপি 3102 এ থাকা অ্যালগরিদম def foo(x=None, y)অনুমতি দেওয়া সত্ত্বেও ঠিক একইভাবে কাজ করতে পারে। তাই আমি এখনও আগ্রহী যে পাইথন এটির অনুমতি দেয় না কেন । এর আসল মৌলিক কারণ আছে বা এটি কেবল "আমরা এটির অনুমতি দিই না কারণ আমরা এটির অনুমতি দিই না"।
জেরোইন ডিমায়ার

15
SyntaxError: non-default argument follows default argument

আপনি যদি এটির অনুমতি দিচ্ছেন তবে ডিফল্ট আর্গুমেন্টগুলি অকেজো হয়ে যাবে কারণ আপনি কখনই তাদের ডিফল্ট মান ব্যবহার করতে পারবেন না, কারণ অ-ডিফল্ট আর্গুমেন্টগুলি পরে আসে ।

পাইথন 3 এ, আপনি নিম্নলিখিতগুলি করতে পারেন:

def fun1(a="who is you", b="True", *, x, y):
    pass

যা তৈরি করে xএবং yকীওয়ার্ড কেবল তাই আপনি এটি করতে পারেন:

fun1(x=2, y=2)

এটি কাজ করে কারণ এখন আর কোনও অস্পষ্টতা নেই। নোট আপনি এখনও করতে পারবেন না fun1(2, 2)(এটি ডিফল্ট আর্গুমেন্ট সেট করে)।


কী খুঁজতে হবে শুধুমাত্র আর্গুমেন্ট পাইথন 3. এটা খুব খারাপ, একটি ঝরঝরে বৈশিষ্ট্য প্যাচ তাদের পাইথন 2.6 এবং 2.7 শুধু হয়েছিল গুলো পুরনো হয় মেয়াদ শেষ বামে
নিক চ্যামাস

10

আমাকে এখানে দুটি পয়েন্ট সাফ করুন:

  • প্রথমত অ-ডিফল্ট আর্গুমেন্টটি ডিফল্ট যুক্তি অনুসরণ করা উচিত নয়, এর অর্থ আপনি ফাংশনটিতে (a = b, c) সংজ্ঞায়িত করতে পারবেন না ফাংশনটিতে প্যারামিটার সংজ্ঞা দেওয়ার ক্রমটি হ'ল:
    • অবস্থানগত পরামিতি বা অ-ডিফল্ট প্যারামিটার অর্থাত (a, b, c)
    • কীওয়ার্ড প্যারামিটার বা ডিফল্ট প্যারামিটার ie (a = "b", r = "j")
    • কী-ওয়ার্ড-প্যারামিটার অর্থাৎ (* আরগস)
    • ভ্যার-কীওয়ার্ড প্যারামিটার অর্থাৎ (** কোয়ার্গস)

def example(a, b, c=None, r="w" , d=[], *ae, **ab):

(ক, খ) হ'ল অবস্থানগত পরামিতি

(সি = কিছুই নয়) চ্ছিক প্যারামিটার

(r = "w") কীওয়ার্ড প্যারামিটার

(d = []) হল তালিকার প্যারামিটার

(* ae) কেবলমাত্র কীওয়ার্ড

(** আব) হ'ল ভ্যার-কীওয়ার্ড প্যারামিটার

  • এখন গৌণ বিষয় হ'ল আমি যদি এরকম কিছু চেষ্টা করি: def example(a, b, c=a,d=b):

ডিফল্ট মানগুলি সংরক্ষণ করা হয় যখন যুক্তি সংজ্ঞায়িত করা হয় না, আপনি ফাংশনটি সংজ্ঞায়িত করার সময় পাইথন গণনা করে এবং ডিফল্ট মানগুলি সংরক্ষণ করে

সি এবং ডি সংজ্ঞায়িত করা হয় না, অস্তিত্ব থাকে না, যখন এটি ঘটে (এটি তখনই উপস্থিত থাকে যখন ফাংশনটি কার্যকর করা হয়)

"a, a = b" এটি প্যারামিটারে অনুমোদিত নয়।


0

প্রয়োজনীয় আর্গুমেন্ট (ডিফল্ট ব্যতীত), ক্লায়েন্ট কোডটি কেবল দুটি সরবরাহ করার মঞ্জুরি দেওয়ার জন্য শুরুতে হওয়া আবশ্যক। Startচ্ছিক যুক্তি শুরুতে থাকলে এটি বিভ্রান্তিকর হবে:

fun1("who is who", 3, "jack")

এটি আপনার প্রথম উদাহরণে কী করবে? সর্বশেষে, x হ'ল "কে কে", y 3 এবং a = "জ্যাক"।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.