कंवरों की सूची पास करना?


95

क्या मैं बौनों की सूची को संक्षिप्तता के लिए एक विधि से पारित कर सकता हूं? यह मैं करने की कोशिश कर रहा हूँ:

def method(**kwargs):
    #do something

keywords = (keyword1 = 'foo', keyword2 = 'bar')
method(keywords)

2
मैं एक समारोह से दूसरे समारोह के kwargs में kwargs पारित करने की कोशिश कर रहा था। बड़ा अच्छा सवाल!
बेंज

जवाबों:


160

हाँ। आप इसे इस तरह करते हैं:

def method(**kwargs):
  print kwargs

keywords = {'keyword1': 'foo', 'keyword2': 'bar'}
method(keyword1='foo', keyword2='bar')
method(**keywords)

पायथन में इसे चलाने से इन समान परिणामों की पुष्टि होती है:

{'keyword2': 'bar', 'keyword1': 'foo'}
{'keyword2': 'bar', 'keyword1': 'foo'}

10
या: कीवर्ड = तानाशाह (कीवर्ड 1 = 'फू', कीवर्ड 2 = 'बार')
नेड डीली

1
**खोल ऑपरेटर एक समारोह से एक और समारोह के kwargs को kwargs पारित करने के लिए इस्तेमाल किया जा सकता। इस कोड पर विचार करें: (newlines टिप्पणियों में अनुमति नहीं दी जाती है) def a(**kw): print(kw), और def b(**kw): a(kw)। यह कोड एक त्रुटि उत्पन्न करेगा क्योंकि kwargs वास्तव में एक शब्दकोष है, और इसे dictप्रकार के नियमित तर्क के रूप में व्याख्या किया जाएगा । यही वजह है कि त्रुटियों को अनपैक करने और हल करने के def b(**kw): a(kw)लिए बदलना । def b(**kw): a(**kw)kw
बेंज

10

जैसा कि दूसरों ने बताया है, आप वही कर सकते हैं जो आप एक तानाशाही पारित करके चाहते हैं। एक तानाशाही के निर्माण के विभिन्न तरीके हैं। एक यह है कि को बरकरार रखता है keyword=valueशैली आपने प्रयास उपयोग करने के लिए है dict निर्मित:

keywords = dict(keyword1 = 'foo', keyword2 = 'bar')

की बहुमुखी प्रतिभा पर ध्यान दें dict; ये सभी समान परिणाम देते हैं:

>>> kw1 = dict(keyword1 = 'foo', keyword2 = 'bar')
>>> kw2 = dict({'keyword1':'foo', 'keyword2':'bar'})
>>> kw3 = dict([['keyword1', 'foo'], ['keyword2', 'bar']])
>>> kw4 = dict(zip(('keyword1', 'keyword2'), ('foo', 'bar')))
>>> assert kw1 == kw2 == kw3 == kw4
>>> 

4

क्या आपका मतलब तानाशाही है? जरूर आप कर सकते हो:

def method(**kwargs):
    #do something

keywords = {keyword1: 'foo', keyword2: 'bar'}
method(**keywords)

आह, मैं ध्यान नहीं दे रहा था। अब बेहतर होना चाहिए।
डेविड जेड

3

इसलिए जब मैं यहां आया हूं तो मैं एक समारोह में कई ** kwargs पास करने का एक तरीका ढूंढ रहा था - बाद में आगे के कार्यों में उपयोग के लिए। क्योंकि यह, आश्चर्य की बात नहीं है, काम नहीं करता है:

def func1(**f2_x, **f3_x):
     ...

कुछ 'प्रायोगिक' कोडिंग के साथ मैं स्पष्ट रूप से यह करने के लिए आया कि यह कैसे करना है:

def func3(f3_a, f3_b):
    print "--func3--"
    print f3_a
    print f3_b
def func2(f2_a, f2_b):
    print "--func2--"
    print f2_a
    print f2_b

def func1(f1_a, f1_b, f2_x={},f3_x={}):
    print "--func1--"
    print f1_a
    print f1_b
    func2(**f2_x)
    func3(**f3_x)

func1('aaaa', 'bbbb', {'f2_a':1, 'f2_b':2}, {'f3_a':37, 'f3_b':69})

यह उम्मीद के मुताबिक प्रिंट करता है:

--func1--
aaaa
bbbb
--func2--
1
2
--func3--
37
69

6
के रूप में संभव हैpython 3.5Foo(**arg1, **arg2)
magu_
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.