2012-09-13 21 views
55

पायथन 3.2.3। कुछ विचार listed here थे, जो नियमित var पर काम करते हैं, लेकिन ऐसा लगता है कि ** विभिन्न नियमों से ** kwargs खेलते हैं ... तो यह क्यों काम नहीं करता है और मैं यह देखने के लिए कैसे जांच सकता हूं कि ** kwargs में कोई कुंजी मौजूद है या नहीं?कैसे जांचें यदि ** kwargs में कोई कुंजी मौजूद है?

if kwargs['errormessage']: 
    print("It exists") 

मैं भी लगता है कि यह काम करना चाहिए, लेकिन यह नहीं है -

if errormessage in kwargs: 
    print("yeah it's here") 

मैं क्योंकि kwargs iterable है अनुमान लगा रहा हूँ? क्या मुझे यह जांचने के लिए सिर्फ एक विशेष कुंजी है या नहीं?

+2

कोई विशेष नियम नहीं है। आप बस उद्धरण भूल गए। –

उत्तर

86

आप

if 'errormessage' in kwargs: 
    print("found it") 

चाहते इस तरह errormessage

if 'errormessage' in kwargs: 
    print("errormessage equals " + kwargs.get("errormessage")) 

का मूल्य पाने के लिए, kwargs सिर्फ एक और dict है। आपका पहला उदाहरण, if kwargs['errormessage'], का अर्थ है "kwargs में कुंजी" त्रुटि से जुड़े मान प्राप्त करें ", और फिर उसके बूल मान की जांच करें"। तो यदि ऐसी कोई कुंजी नहीं है, तो आपको KeyError मिल जाएगा।

आपका दूसरे उदाहरण, if errormessage in kwargs:, जिसका अर्थ errormessage ", और जब तक" errormessage "एक चर का नाम है, आप मिल जाएगा एक NameError

मैं उल्लेख करना चाहिए कि" अगर kwargs तत्व द्वारा नाम शामिल है " शब्दकोशों में एक विधि .get() भी है जो एक डिफ़ॉल्ट पैरामीटर स्वीकार करता है (स्वयं None पर डिफ़ॉल्ट हो जाता है), ताकि kwargs.get("errormessage") उस मान को वापस कर दे, यदि वह कुंजी मौजूद है और None अन्यथा (इसी प्रकार kwargs.get("errormessage", 17) ऐसा करता है जो आप सोच सकते हैं)। जब आपको परवाह नहीं है मौजूदा कुंजी के बीच अंतर और None एक मान या कुंजी के रूप में ई नहीं है xisting, यह आसान हो सकता है।

8

यह सिर्फ यह है:

if 'errormessage' in kwargs: 
    print("yeah it's here") 

आपको यह देखना होगा, यदि कुंजी शब्दकोश में है की जरूरत है। इसके लिए वाक्यविन्यास some_key in some_dict है (जहां some_key कुछ हैशबल है, आवश्यक रूप से एक स्ट्रिंग नहीं है)।

आपके द्वारा लिंक किए गए विचार (these ideas) में यह जांचने के लिए उदाहरण हैं कि locals() और globals() द्वारा लौटाए गए शब्दकोशों में विशिष्ट कुंजी मौजूद है या नहीं। आपका उदाहरण समान है, क्योंकि आप kwargs शब्दकोश (कीवर्ड शब्द युक्त शब्दकोष) में विशिष्ट कुंजी के अस्तित्व की जांच कर रहे हैं।

1

आप खुद को आसानी से उन चीजों की खोज कर सकते हैं:

def hello(*args, **kwargs): 
    print kwargs 
    print type(kwargs) 
    print dir(kwargs) 

hello(what="world") 
+3

"आसान" निकालें और फिर यह एक बेहतर जवाब है। अगर यह सबके लिए आसान था, तो हमें इस साइट की आवश्यकता नहीं होगी। अपने आप में 'in' ऑपरेटर खोजना आसान अगर आप प्रोग्राम किया कभी नहीं किया है और/या अजगर के लिए नए हैं नहीं है। यह केवल 'dict.get()' और 'dict.setdefault() 'सहायता में संकेत दिया जा रहा है। – cfi

2

एक तरह से यह अपने आप को जोड़ने के लिए है! कैसे? डिफ़ॉल्ट के गुच्छा के साथ kwargs विलय करके। यह सभी अवसरों पर उपयुक्त नहीं होगा, उदाहरण के लिए यदि चाबियाँ आपको पहले से नहीं जानती हैं।

import sys 

def myfunc(**kwargs): 
    args = {'country':'England','town':'London', 
      'currency':'Pound', 'language':'English'} 

    diff = set(kwargs.keys()) - set(args.keys()) 
    if diff: 
     print("Invalid args:",tuple(diff),file=sys.stderr) 
     return 

    args.update(kwargs)    
    print(args) 

चूक शब्दकोश args है, जो सभी चाबियाँ हम उम्मीद कर रहे हैं शामिल हैं में स्थापित कर रहे हैं: लेकिन अगर वे कर रहे हैं, यहाँ एक सरल उदाहरण है। हम सबसे पहले यह देखने के लिए जांच करते हैं कि क्या क्वार्ग में कोई अप्रत्याशित कुंजी है या नहीं।फिर हम argskwargs के साथ अपडेट करते हैं जो उपयोगकर्ता द्वारा सेट किए गए किसी भी नए मान को ओवरराइट करेगा। यदि कोई कुंजी मौजूद है, तो हमें परीक्षण करने की आवश्यकता नहीं है, अब हम args का उपयोग हमारे तर्क शब्दकोश के रूप में करते हैं और kwargs की आवश्यकता नहीं है।

11

डीएसएम और टेडेक के उत्तर सीधे आपके प्रश्न का उत्तर देते हैं।

मेरी लिपियों में मैं अक्सर वैकल्पिक, और अतिरिक्त तर्कों से निपटने के लिए सुविधाजनक dict.pop() का उपयोग करता हूं।

def my_print(*args, **kwargs): 
    prefix = kwargs.pop('prefix', '') 
    print(prefix, *args, **kwargs) 

तब:

>>> my_print('eggs') 
eggs 
>>> my_print('eggs', prefix='spam') 
spam eggs 

आप देख सकते हैं, अगर prefixkwargs में शामिल नहीं है, तो डिफ़ॉल्ट '' (रिक्त स्ट्रिंग) में संग्रहीत किया जा रहा है यहाँ एक सरल print() आवरण का एक उदाहरण है स्थानीय prefix चर। यदि यह दिया जाता है, तो इसका मूल्य उपयोग किया जा रहा है।

यह आम तौर पर समारोह के किसी भी प्रकार के लिए रैपर लिखने के लिए एक कॉम्पैक्ट और पठनीय नुस्खा है: हमेशा बस पास-थ्रू तर्क आप समझ में नहीं आता है, और यह भी नहीं जानते कि अगर वे मौजूद हैं। आप हमेशा *args के माध्यम से गुजरती हैं और अगर **kwargs आप अपने कोड की गति धीमी हो, और एक थोड़ा और अधिक लिखना पड़ता है, लेकिन बदलाव (इस मामले print में) कहा जाता है समारोह के इंटरफेस, आप अपने कोड को बदलने की जरूरत नहीं है। यह दृष्टिकोण सभी इंटरफ़ेस परिवर्तनों का समर्थन करते समय विकास के समय को कम करता है।