2012-01-23 18 views
12

अजगर में, मैं अपने आप को पढ़ाने के लिए इस समारोह में लिखा था कि कैसे पायथन में **kwargs काम करता है:पायथन में, कबूतर के माध्यम से पुनरावृत्ति करते समय आदेश निर्धारित करता है?

def fxn(a1, **kwargs): 
    print a1 
    for k in kwargs: 
     print k, " : ", kwargs[k] 

मैं तो इस समारोह

fxn(3, a2=2, a3=3, a4=4) 

साथ कहा जाता है यहाँ उत्पादन था कि मेरे अजगर दुभाषिया मुद्रित:

3 
a3 : 3 
a2 : 2 
a4 : 4 

फॉर लूप ने ए 2 के पहले ए 3 के मूल्य को क्यों मुद्रित किया, भले ही मैंने पहले अपने कार्य में ए 2 खिलाया था?

उत्तर

24

kwargs एक शब्दकोश है। शब्दकोश अनियंत्रित हैं - बस डालें, आदेश निर्दिष्ट नहीं है और एक कार्यान्वयन विवरण है। हुड के नीचे देखकर यह दिखाया जाएगा कि आदेश वस्तुओं के हैश मूल्यों, सम्मिलन के क्रम आदि के आधार पर जंगली रूप से भिन्न होता है ताकि आप इससे बेहतर कुछ भी भरोसा न करें।

1

kwargs पाइथन में एक शब्दकोश है, इनका आदेश नहीं दिया गया है, इसलिए परिणाम अनिवार्य रूप से (छद्म-) यादृच्छिक है।

10

यह एक शब्दकोश है।

यह कुंजी के अव्यवस्थित सेट के रूप में एक शब्दकोश के बारे में सोच के लिए सबसे अच्छा है: और, जैसा कि दस्तावेज में उल्लेख किया है, शब्दकोश कोई आदेश (http://docs.python.org/tutorial/datastructures.html#dictionaries से) है आवश्यकता के साथ, मान युग्म कि चाबी अद्वितीय हैं (एक शब्दकोश के भीतर)।

लेकिन आप इसे, कुछ आदेश में संसाधित ऐसा बना सकते हैं:

  • sorted() का उपयोग कर:

    def fxn(a1, **kwargs): 
        print a1 
        for k in sorted(kwargs): # notice "kwargs" replaced by "sorted(kwargs)" 
         print k, " : ", kwargs[k] 
    
  • या OrderedDict प्रकार का उपयोग करके (आप OrderedDict वस्तु पारित कर सकते हैं पैरामीटर के रूप में सभी कुंजी-मूल्य जोड़े):

    from collections import OrderedDict 
    
    def fxn(a1, ordkwargs): 
        print a1 
        for k in ordkwargs: 
         print k, " : ", ordkwargs[k] 
    
    fxn(3, OrderedDict((('a2',2), ('a3',3), ('a4',4)))) 
    
+0

OrderedDict के संबंध में मेरा उत्तर देखें – PaulMcG

+0

@PaulMcGuire:।।। देखें आपके उत्तर पर मेरी टिप्पणी। – Tadeck

+0

क्या आप इसे 'fxn (3, ** ऑर्डरर्ड डिक्ट (आदि ...' के रूप में नहीं लिखेंगे? ओह रुको, मैं देखता हूं कि आपने एक निर्देश लेने के लिए हस्ताक्षर बदल दिया है, न कि कीवर्ड तर्कों का एक सेट यदि आप हस्ताक्षर को बदलने जा रहे हैं, तो आप अपने कुंजी-मूल्य टुपल्स की एक सूची भी पास कर सकते हैं। लेकिन ओपी वास्तव में ** kwargs पर फिर से शुरू करना चाहता था। – PaulMcG

2

kwargs के बाद से एक अजगर शब्दकोश है, जो एक hash table के रूप में कार्यान्वित किया जाता है, इसके आदेश संरक्षित और प्रभावी ढंग से यादृच्छिक है नहीं है।

असल में, कई प्रोग्रामिंग भाषाओं में हाल ही में security issue पर एक फिक्स के रूप में, भविष्य में ऑर्डर आपके प्रोग्राम के आमंत्रण (पायथन दुभाषिया के आविष्कार) के बीच भी बदल सकता है।

od = OrderedDict(a=1, b=2, c=3) 

के बाद से keyworded आर्ग पहले में निर्मित होते हैं:

+2

यादृच्छिक नहीं - वास्तव में, यह पूरी तरह से निर्धारित है। बस आसानी से अनुमानित नहीं है, क्योंकि यह हैश पर निर्भर करता है। –

+1

आप बिल्कुल सही हैं। यही कारण है कि मैंने पाठक को इंगित करने के लिए "प्रभावशाली यादृच्छिक" कहा था, उसे अनुमान लगाने का प्रयास नहीं करना चाहिए। एक तरफ ध्यान दें, लगभग हर चीज एक कंप्यूटर करता है, लेकिन यह आसानी से अनुमानित नहीं हो सकता है :) – spatz

4

दुर्भाग्यपूर्ण विडंबना ** kwargs की dict-वर्गीकरण इसका मतलब है कि निम्नलिखित (कम से कम जिस तरह से नहीं एक उम्मीद होती है) काम नहीं करेगा है एक अनियंत्रित निर्देश, आप इस बात पर निर्भर नहीं हो सकते कि वे ऑर्डर्ड डिक्ट में सूचीबद्ध क्रम में डाले जाएंगे।:(

+1

लेकिन निम्नलिखित होगा: 'od = OrderedDict ((('a', 1), ('b', 2), (' सी ', 3))) '। तो मूल रूप से '** kwargs', क्योंकि यह' dict' है, उसके पास कोई ऑर्डर नहीं होगा, लेकिन आप हमेशा पैरामीटर के रूप में 'ऑर्डर्ड डिक्ट' पास कर सकते हैं, और उसके पास वह ऑर्डर होगा जो आप चाहते हैं। – Tadeck

3

यह अंत में 3.6 release में पेश किया गया है **kwargs अब एक OrderedDict है, इसलिए कीवर्ड तर्क क्रम संरक्षित किया जा रहा है

Python 3.6.0 (default, Jan 13 2017, 13:27:48) 
>>> def print_args(**kwargs): 
...  print(kwargs.keys()) 
... 
>>> print_args(first=1, second=2, third=3) 
dict_keys(['first', 'second', 'third']) 
+0

'** kwargs' पायथन 3.6 में 'ऑर्डर्ड डिक्ट' नहीं है। वे एक 'dict'' बने रहते हैं, लेकिन अब 'dict' का आदेश दिया गया है। –