কীওয়ার্ড প্যারামিটার হিসাবে কোনও ফাংশনে একটি অভিধান পাস করা


346

আমি অভিধান ব্যবহার করে পাইথনে একটি ফাংশন কল করতে চাই।

এখানে কিছু কোড রয়েছে:

d = dict(param='test')

def f(param):
    print(param)

f(d)

এই মুদ্রণ {'param': 'test'} কিন্তু আমি এটি শুধু মুদ্রণ করতে চাই test

আমি এটি আরও পরামিতিগুলির জন্য একইভাবে কাজ করতে চাই:

d = dict(p1=1, p2=2)
def f2(p1, p2):
    print(p1, p2)
f2(d)

এটা কি সম্ভব?

উত্তর:


528

শেষ পর্যন্ত আমার জন্য এটি খুঁজে বের করা। এটি সহজ, আমি অভিধানটি আনপ্যাক করার জন্য কেবল ** অপারেটরটি হারিয়েছিলাম

সুতরাং আমার উদাহরণ হয়ে যায়:

d = dict(p1=1, p2=2)
def f2(p1,p2):
    print p1, p2
f2(**d)

57
আপনি যদি এটি অন্যকে সহায়তা করতে চান তবে আপনার প্রশ্নটি পুনর্বিবেচনা করা উচিত: সমস্যাটি একটি অভিধান পাস করছিল না, আপনি যা চেয়েছিলেন সেটি কোনও কীওয়ার্ড প্যারামিটারে পরিণত হয়েছিল
জাভিয়ের

11
এটি লক্ষণীয় যে আপনি অবস্থানগত আর্গুমেন্টগুলির তালিকাও আনপ্যাক করতে পারেন: f2 (* [1,2])
ম্যাথু ট্রেভর

10
"অবজ্ঞাপন": পাইথন প্রসঙ্গে সাধারণ শব্দটি হ'ল "আনপ্যাক"। :)
মিপাদি

2
এটি দুর্দান্ত, সবেমাত্র এটি একটি অর্গপার্স / __ ডিক__ এর সাথে ব্যবহার করে কমান্ড লাইন আর্গুমেন্টটি কোনও শ্রেণীর অবজেক্টের জন্য সরাসরি বিকল্পগুলিতে পার্সিং করা সত্যিই সহজ করে তোলে।
হোরাস

1
কোন অভিধানে কোনও ফাংশনের আর্গুমেন্ট হিসাবে পাস করার সময় আমরা কোনও অভিধানটি আনপ্যাক করতে চাইার কারণ কী?
মোনা জালাল

128
In[1]: def myfunc(a=1, b=2):
In[2]:    print(a, b)

In[3]: mydict = {'a': 100, 'b': 200}

In[4]: myfunc(**mydict)
100 200

কয়েকটি অতিরিক্ত বিশদ যা জানার জন্য সহায়ক হতে পারে (এগুলি পড়ার পরে আমার যে প্রশ্নগুলি হয়েছিল এবং পরীক্ষার চেষ্টা করেছি):

  1. ফাংশনে এমন পরামিতি থাকতে পারে যা না অভিধানে পাওয়া
  2. আপনি পারবেন না ইতিমধ্যে অভিধানে থাকা পরামিতিটিকে ওভাররাইড
  3. অভিধান পারেন না প্যারামিটার ফাংশনে না আছে।

উদাহরণ:

সংখ্যা 1: ফাংশনটিতে প্যারামিটার থাকতে পারে যা অভিধানে অন্তর্ভুক্ত নেই

In[5]: mydict = {'a': 100}
In[6]: myfunc(**mydict)
100 2

সংখ্যা 2: আপনি অভিধানে ইতিমধ্যে থাকা পরামিতিটিকে ওভাররাইড করতে পারবেন না

In[7]: mydict = {'a': 100, 'b': 200}
In[8]: myfunc(a=3, **mydict)

TypeError: myfunc() got multiple values for keyword argument 'a'

সংখ্যা 3: অভিধানটিতে প্যারামিটারগুলি থাকতে পারে যা ফাংশনে নেই।

In[9]:  mydict = {'a': 100, 'b': 200, 'c': 300}
In[10]: myfunc(**mydict)

TypeError: myfunc() got an unexpected keyword argument 'c'

মন্তব্যে অনুরোধ করা হিসাবে, 3 নম্বরের একটি সমাধান হ'ল ফাংশনে উপলব্ধ কীওয়ার্ড আর্গুমেন্টগুলির উপর ভিত্তি করে অভিধানটি ফিল্টার করা:

In[11]: import inspect
In[12]: mydict = {'a': 100, 'b': 200, 'c': 300}
In[13]: filtered_mydict = {k: v for k, v in mydict.items() if k in [p.name for p in inspect.signature(myfunc).parameters.values()]}
In[14]: myfunc(**filtered_mydict)
100 200

অন্য বিকল্পটি হ'ল আপনার ফাংশনে অতিরিক্ত কাওয়ারগুলি গ্রহণ (এবং উপেক্ষা):

In[15]: def myfunc2(a=None, **kwargs):
In[16]:    print(a)

In[17]: mydict = {'a': 100, 'b': 200, 'c': 300}

In[18]: myfunc2(**mydict)
100

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

In[19]: def myfunc3(a, *posargs, b=2, **kwargs):
In[20]:    print(a, b)
In[21]:    print(posargs)
In[22]:    print(kwargs)

In[23]: mylist = [10, 20, 30]
In[24]: mydict = {'b': 200, 'c': 300}

In[25]: myfunc3(*mylist, **mydict)
10 200
(20, 30)
{'c': 300}

4
মুদ্রণ.ফর্ম্যাট সহ আনপ্যাকিং ব্যবহার বিশেষভাবে কার্যকর। যেমন:'hello {greeting} {name}'.format( **{'name': 'Andrew', 'greeting': 'Mr'})
মার্টারলাক

পুরানো প্রশ্ন কিন্তু এখনও খুব প্রাসঙ্গিক। বিস্তারিত প্রতিক্রিয়া জন্য ধন্যবাদ। কেস 3 এর আশপাশে কাজ করার কোনও উপায় আপনি জানেন? অর্থ পাইথোনিকভাবে অভিধানের আইটেমগুলিকে ফাংশন পরামিতিগুলিতে মানচিত্র করুন, যখন অভিধানে পরামিতিগুলির চেয়ে বেশি আইটেম থাকে?
স্পেন্সার

2
@ স্পেন্সার উত্তরে একটি সমাধান যুক্ত করা হয়েছে।
ডেভিড পার্কস

33

পাইথনে, একে "আনপ্যাকিং" বলা হয় এবং আপনি টিউটোরিয়ালে এটি সম্পর্কে কিছুটা খুঁজে পেতে পারেন । এটির ডকুমেন্টেশনটি সফল হয়, বিশেষত এটি কতটা দুর্দান্তভাবে কার্যকর তা কারণেই আমি সম্মত।


20
সময় শেষ না হওয়া পর্যন্ত টিকে থাকা লিঙ্কটির উপর নির্ভর না করে আপনার উত্তরে লিংকের প্রাসঙ্গিক সামগ্রীটি অনুলিপি করা ভাল।
রিচার্ড

3
@ রিচার্ড এটি ওয়েব সম্পর্কে একটি গভীর দার্শনিক মতামত, যার সাথে আমি আরও আন্তরিকতার সাথে একমত হতে পারি না! হায়রে, আমার চমৎকার প্রমাণটি ভাগ করে নেওয়ার জন্য আমার এখানে এই ব্যবধানের অভাব নেই ...
লিমিলেব

@ লিমলিব, আমাকে তখন ডঃ উইলসকে জিজ্ঞাসা করতে হবে!
রিচার্ড

6

এখানে আপনি যান - কেবলমাত্র কোনও পুনরাবৃত্তির কাজ করে:

d = {'param' : 'test'}

def f(dictionary):
    for key in dictionary:
        print key

f(d)

দেখে মনে হচ্ছে যে লোকেরা এটি পুনরুদ্ধারকৃত প্রশ্নের নয়, মূল প্রশ্নের উত্তর দেওয়ার সাথে সাথে এটি হ্রাস করছে। আমি এখনই এই পোস্টটি সরাতে পরামর্শ দিচ্ছি।
dotancohen

@ ডটানকোহেন না এটি কখনই সঠিক ছিল না, এটি কোডের দ্বিতীয় ব্লকটি ব্যর্থ করে যা সর্বদা প্রশ্নের সাথে ছিল। এটি খুব আক্ষরিকভাবে গ্রহণ করেছে, মুদ্রণের একটি উদাহরণ ছিল।
ডেভ হিলিয়ার

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