সাধারণ আর্গুমেন্ট বনাম কীওয়ার্ড আর্গুমেন্ট


289

কীভাবে "কীওয়ার্ড আর্গুমেন্টগুলি" নিয়মিত যুক্তি থেকে আলাদা? name=valueঅবস্থানগত সিনট্যাক্স ব্যবহারের পরিবর্তে সমস্ত যুক্তি কি পাস করা যায় না ?


6
তারা পাইথন 3. দেখুন এই জিনিস কিছু tidying আপ করছি - আপনি PEP 3102 পড়তে চাইবেন python.org/dev/peps/pep-3102
বেন Hoyt

এবং একটি ডিফল্ট মান আছে কি না এর সাথে কিছুই করার নেই (এ জন্য আপনাকে কোনও মান পাস করার দরকার আছে কিনা), তাই না?
এম কে 12


@ বেন হোয়েট পাইথন 3 এর আওতায় নীচে একটি উত্তর যুক্ত করেছেন, প্রয়োজনীয় কী-ওয়ার্ড আর্গুমেন্ট
ক্রিস্টোফ রাউসি

উত্তর:


346

দুটি সম্পর্কিত ধারণা রয়েছে, দুটিকেই " কীওয়ার্ড আর্গুমেন্ট " বলা হয় ।

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

অন্য ধারণাটি ফাংশন সংজ্ঞায়নের দিকে রয়েছে: আপনি কোনও ফাংশনটি সংজ্ঞায়িত করতে পারেন যা নাম অনুসারে পরামিতি নেয় - এবং আপনাকে সেই নামগুলি কী তা নির্দিষ্ট করতে হবে না। এগুলি খাঁটি কীওয়ার্ড আর্গুমেন্ট এবং অবস্থানগতভাবে পাস করা যায় না। বাক্য গঠনটি হ'ল

def my_function(arg1, arg2, **kwargs)

আপনি এই ফাংশনটিতে যে কোনও কীওয়ার্ড আর্গুমেন্টটি পাস করবেন নামের একটি অভিধানে স্থাপন করা হবে kwargs। রান-টাইমে আপনি এই অভিধানের কীগুলি পরীক্ষা করতে পারেন:

def my_function(**kwargs):
    print str(kwargs)

my_function(a=12, b="abc")

{'a': 12, 'b': 'abc'}

5
+1 এবং স্বীকৃত: আপনিই একমাত্র যিনি উভয় প্রকারের অবস্থানগত + কীওয়ার্ড যুক্তি সম্পর্কে কথা বলেছেন, অন্যরা সবাই ভেবেছিল আমি প্রথম বা দ্বিতীয়টির বিষয়ে কথা বলছি (তবে তারা এখনও ভাল পোস্ট ছিল)। ধন্যবাদ!
এম কে 12

34
শব্দটি অস্পষ্ট: সাধারণত আপনি কলিং সাইডে আর্গুমেন্টের কথা বলছেন যখন ডাকা দিকের প্যারামিটারগুলি থাকে।
glglgl

3
প্যারামিটারের নাম থাকতে হবে kwargsবা আমি এটির নাম পরিবর্তন করতে পারি। মত options( def my_fuction(arg1, arg2, **options))?
ব্রুস সান

1
নামটি যে কোনও কিছু হতে পারে, যদিও kwargsএটির অধিবেশন যখন বেশি উপযুক্ত নাম না হয়
ম্যাট জিমারম্যান

আমি মনে করি যে এখানে ব্যাখ্যা করা দ্বিতীয় ধারণাটি প্রযুক্তিগতভাবে আরবিট্রিয় কীওয়ার্ড আর্গুমেন্ট হিসাবে পরিচিত।
আনশুল দাহিয়া

188

একটি শেষ ভাষার বৈশিষ্ট্য রয়েছে যেখানে পার্থক্যটি গুরুত্বপূর্ণ। নিম্নলিখিত ফাংশন বিবেচনা করুন:

def foo(*positional, **keywords):
    print "Positional:", positional
    print "Keywords:", keywords

*positionalযুক্তি প্রেরণ অবস্থানগত এর সব আর্গুমেন্ট সংরক্ষণ করবে foo(), কোন সীমা সঙ্গে আপনি কত প্রদান করতে পারেন হবে।

>>> foo('one', 'two', 'three')
Positional: ('one', 'two', 'three')
Keywords: {}

**keywordsযুক্তি কোনো শব্দ আর্গুমেন্ট সংরক্ষণ করবে:

>>> foo(a='one', b='two', c='three')
Positional: ()
Keywords: {'a': 'one', 'c': 'three', 'b': 'two'}

এবং অবশ্যই, আপনি উভয় একই সময়ে ব্যবহার করতে পারেন:

>>> foo('one','two',c='three',d='four')
Positional: ('one', 'two')
Keywords: {'c': 'three', 'd': 'four'}

এই বৈশিষ্ট্যগুলি খুব কমই ব্যবহৃত হয়, তবে মাঝে মধ্যে সেগুলি খুব দরকারী এবং কোন যুক্তি অবস্থানগত বা কীওয়ার্ডগুলি তা জানা গুরুত্বপূর্ণ।


3
দুর্দান্ত উত্তর! কেবলমাত্র একটি নোট যে প্রয়োজনীয় অবস্থানগত আর্গুমেন্টগুলি আগে পাস করা যেতে পারে *positionalএবং **keywordsযদি আমরা ফাংশন সংজ্ঞা পরিবর্তন করি def foo(arg1, *positional, **keywords):। এখানে arg1অবস্থানগত এবং প্রয়োজনীয়। দয়া করে নোট করুন যে উত্তরের স্থিতির অর্থ alচ্ছিক এবং অবস্থানগত আর্গুমেন্টের পরিবর্তনশীল সংখ্যার।
শেফূও

2
হ্যাঁ ভাল উত্তর। অন্য দ্রষ্টব্য: আপনি যদি আপনার ফাংশনটিতে কল করেন তবে আপনি foo(bar=True)মানগুলি bar = keywords.pop('bar')একই হিসাবে ব্যবহার করতে পারেন bar = keywords.pop('bar', None)। ডিফল্ট মান, ব্যবহারের জন্যbar = keywords.pop('bar', False)
olibre

111

অর্ডার ব্যতীত মূল আর্গুমেন্টের মতো কীওয়ার্ড আর্গুমেন্ট ব্যবহার করা একই জিনিস। উদাহরণস্বরূপ নীচের দুটি ফাংশন কল একই:

def foo(bar, baz):
    pass

foo(1, 2)
foo(baz=2, bar=1)

3
এর জন্য ধন্যবাদ. এটি অবিশ্বাস্যরূপে কার্যকর যে আমি উভয়কে একটি অবস্থানগত আরগ হিসাবে কোনও কীওয়ার্ড আরগ এবং কীওয়ার্ড আরগ হিসাবে পজিশনাল আরগ নির্দিষ্ট করতে পারি ।
লুক ডেভিস

47

অবস্থানগত যুক্তি

তাদের আগে তাদের কোনও কীওয়ার্ড নেই। অর্ডারটি গুরুত্বপূর্ণ!

func(1,2,3, "foo")

কীওয়ার্ড আর্গুমেন্ট

তাদের সামনে কীওয়ার্ড রয়েছে। তারা যে কোনও ক্রমে হতে পারে!

func(foo="bar", baz=5, hello=123)

func(baz=5, foo="bar", hello=123)

আপনার এও জানা উচিত যে আপনি কীওয়ার্ডগুলি সন্নিবেশ করানোর জন্য যদি ডিফল্ট যুক্তি এবং অবহেলা ব্যবহার করেন তবে অর্ডারটি তখন গুরুত্ব পাবে!

def func(foo=1, baz=2, hello=3): ...
func("bar", 5, 123)

8
আইএমএইচও, তৃতীয় উদাহরণ (ডিফল্ট যুক্তি) পরিষ্কার নয়। আমি মনে করি আপনি যখন এক বা একাধিক প্যারামিটারগুলি ডিফল্ট মানগুলি ঘোষণা করেন তখন কী হয় সে সম্পর্কে আপনি কথা বলছেন এবং কলটি অবস্থানগত স্বরলিপি ব্যবহার করে তবে ঘোষিত প্যারামিটারের সংখ্যার চেয়ে কম সরবরাহ করে। তবে আপনার উদাহরণটিতে 3 টি ঘোষণা করা হয়েছে এবং 3 টি কল রয়েছে, সুতরাং ডিফল্ট মানগুলির কোনও প্রভাব নেই! আপনি কি তৃতীয় আর্গটি বাদ দিতে চান? যেমন func("bar", 5)? এবং তারপরে helloএটির ডিফল্ট মানটি বলে 3
টুলমেকারস্টেভ

25

ফাংশন প্যারামিটারগুলিতে আর্গুমেন্টের মান নির্ধারণের দুটি উপায় রয়েছে, উভয়ই ব্যবহৃত হয়।

  1. অবস্থান দ্বারা। পজিশনাল আর্গুমেন্টগুলির কীওয়ার্ড নেই এবং প্রথমে বরাদ্দ করা হয়েছে।

  2. কীওয়ার্ড দ্বারা। কীওয়ার্ড আর্গুমেন্টগুলির কীওয়ার্ড থাকে এবং অবস্থানগত আর্গুমেন্টের পরে দ্বিতীয় বরাদ্দ করা হয়।

মনে রাখবেন যে আপনার কাছে অবস্থানগত আর্গুমেন্টগুলি ব্যবহার করার বিকল্প রয়েছে।

আপনি যদি স্থিতি যুক্তি ব্যবহার না করেন, তবে - হ্যাঁ - আপনি যা লিখেছিলেন তা সমস্ত কিওয়ার্ড আর্গুমেন্ট হিসাবে প্রমাণিত।

আপনি যখন কোনও ফাংশন কল করেন আপনি অবস্থান বা কীওয়ার্ড বা মিশ্রণটি ব্যবহার করার সিদ্ধান্ত নেন। আপনি চাইলে সমস্ত কীওয়ার্ড করতে বেছে নিতে পারেন। আমাদের মধ্যে কেউ কেউ এই পছন্দটি করে না এবং অবস্থানগত যুক্তি ব্যবহার করে না।


1
ওহ, আমি প্যারামিটারগুলির বিষয়ে ভাবছিলাম, যখন এটি আসলে কী যুক্তিগুলি ( আমি কী পাস করি)। ধন্যবাদ!
এম কে 12

24

আমি অবাক হয়ে গিয়েছি যে কেউ কেউ উল্লেখ করেছে বলে মনে হয় না যে কেউ কীড আর্গুমেন্ট প্যারামিটারগুলির একটি অভিধান পাস করতে পারে, যা ফর্মাল প্যারামিটারগুলি পূরণ করে, যেমন।

>>> def func(a='a', b='b', c='c', **kwargs):
...    print 'a:%s, b:%s, c:%s' % (a, b, c)
... 
>>> func()
a:a, b:b, c:c
>>> func(**{'a' : 'z', 'b':'q', 'c':'v'})
a:z, b:q, c:v
>>> 

11
একটি দরকারী কৌশল জন্য +1। আপনার কথাটি পরিষ্কার, ছাড়াই হবে , **kwargs। এটি প্রদর্শিত হবে যে একটি নির্দিষ্ট # প্যারামিটার সহ একটি সাধারণ ফানক ডিএফ, অভিধান সরবরাহ করা যেতে পারে। এটি হ'ল সংজ্ঞা অনুসারে এর কোনও অভিনব কোনও প্রয়োজন নেই। তারপরে আপনি একটি দ্বিতীয় উদাহরণ যুক্ত করতে পারেন, সংজ্ঞা অনুসারে ** কোয়ার্গ্স সহ, এবং দেখান যে অভিধানে কীভাবে অতিরিক্ত আইটেমগুলি পাওয়া যায়।
টুলমেকারস্টেভ

1
আমি বিভিন্ন লাইব্রেরির উত্স কোডে এটি ঘটতে দেখেছি এবং তাই বিভ্রান্ত হয়েছিলাম। পরিষ্কার করার জন্যে ধন্যবাদ!
ক্রেগ ল্যাবেঞ্জ

3
উপরের চতুর্থ আনুষ্ঠানিক প্যারামিটার - ** কাওয়ার্গস প্রয়োজনীয় যদি আপনি কখনও 'ড' অভিধানের সাথে ফানক কল করেন যা 'এ', 'বি' এবং 'সি' ব্যতীত অন্য কীগুলি ধারণ করে।
এডুয়ার্ডো

আমার জন্য print 'a:%s, b:%s, c:%s' % (a, b, c)সিনট্যাক্স ত্রুটি দেয়, তবে print('a:%s, b:%s, c:%s' % (a, b, c))কাজ করে। পাইথন সংস্করণ সহ কিছু? যাইহোক, এই অন্তর্দৃষ্টিটির জন্য ধন্যবাদ, এখন অবধি আমি আরও print('a:{}, b:{}, c:{}'.format(a, b, c))
আটকানো

17

পাইথন 3 ব্যবহার করে আপনার প্রয়োজনীয় এবং অ-প্রয়োজনীয় উভয় কীওয়ার্ড যুক্তি থাকতে পারে :


Alচ্ছিক : (প্যারাম 'বি' এর জন্য ডিফল্ট মান সংজ্ঞায়িত)

def func1(a, *, b=42):
    ...
func1(value_for_a) # b is optional and will default to 42

প্রয়োজনীয় (প্যারাম 'বি' এর জন্য কোনও ডিফল্ট মান নির্ধারণ করা হয়নি):

def func2(a, *, b):
    ... 
func2(value_for_a, b=21) # b is set to 21 by the function call
func2(value_for_a) # ERROR: missing 1 required keyword-only argument: 'b'`

এটি এমন ক্ষেত্রে সহায়তা করতে পারে যেখানে আপনার একে অপরের পাশে অনেকগুলি অনুরূপ যুক্তি রয়েছে বিশেষত যদি তারা একই ধরণের হয় তবে সে ক্ষেত্রে আমি নামযুক্ত আর্গুমেন্টগুলি ব্যবহার করতে পছন্দ করি বা তর্কগুলি যদি এক সাথে থাকে তবে আমি একটি কাস্টম ক্লাস তৈরি করি।


3
প্রয়োজনীয় বৈকল্পিক বেশ দরকারী। এটি ডিফল্ট সরবরাহ না করে নাম দিয়ে অর্গগুলি দেওয়ার জন্য অনুরোধ করে, যা প্রায়শই কোনও অর্থবহ হয় না।
TNT

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

11

আমি অবাক হয়েছি কেউ এই সত্যটি উল্লেখ করেনি যে আপনি অবস্থানগত এবং কীওয়ার্ড যুক্তিগুলি মিশ্রিত করতে পারেন যেমন এই জাতীয় ব্যবহার করে *argsএবং **kwargs( এই সাইট থেকে ):

def test_var_kwargs(farg, **kwargs):
    print "formal arg:", farg
    for key in kwargs:
        print "another keyword arg: %s: %s" % (key, kwargs[key])

এটি আপনাকে স্বেচ্ছাচারী কীওয়ার্ড আর্গুমেন্টগুলি ব্যবহার করতে দেয় যা আপনার সামনে কীভাবে সংজ্ঞা দিতে চান না এমন কী থাকতে পারে।


0

আমি এমন একটি উদাহরণ সন্ধান করছিলাম যাতে টীকা টীকাটি ব্যবহার করে ডিফল্ট কাওয়ার্গস ছিল:

def test_var_kwarg(a: str, b: str='B', c: str='', **kwargs) -> str:
     return ' '.join([a, b, c, str(kwargs)])

উদাহরণ:

>>> print(test_var_kwarg('A', c='okay'))
A B okay {}
>>> d = {'f': 'F', 'g': 'G'}
>>> print(test_var_kwarg('a', c='c', b='b', **d))
a b c {'f': 'F', 'g': 'G'}
>>> print(test_var_kwarg('a', 'b', 'c'))
a b c {}

0

ফাংশনটি কল করার সময় মূল শব্দের মধ্যে বরাদ্দ না করা যুক্তিগুলির ডিফল্ট মান নির্ধারণের জন্য কেবলমাত্র পূর্ণতা / যুক্ত করার উপায় যুক্ত করুন :

def func(**keywargs):
if 'my_word' not in keywargs:
    word = 'default_msg'
else:
    word = keywargs['my_word']
return word

এটিকে কল করুন:

print(func())
print(func(my_word='love'))

তুমি পাবে:

default_msg
love

অজগর সম্পর্কে *argsএবং আরও পড়ুন **kwargs: https://www.digitalocean.com/commune/tutorials/how-to-use-args-and-kwargs-in-python-3

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