कैसे जांच करें कि क्या ** kwargs में कोई कुंजी मौजूद है?


111

अजगर 3.2.3। यहाँ कुछ विचारों को सूचीबद्ध किया गया था , जो नियमित रूप से काम करते हैं, लेकिन ऐसा लगता है कि ** kwargs अलग-अलग नियमों से खेलते हैं ... इसलिए यह काम क्यों नहीं करता है और मैं यह देखने के लिए कैसे जांच कर सकता हूं कि क्या ** kwargs मौजूद है?

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

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

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

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


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

जवाबों:


164

तुम्हें चाहिए

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:अर्थ है, "यदि kwargsइसमें" errormessage" नाम का तत्व है , और जब तक कि" errormessage"एक चर का नाम नहीं है, आपको एक मिल जाएगा NameError।"

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


अतिरिक्त स्पष्टीकरण के लिए धन्यवाद! अजगर नवागंतुकों के लिए हमेशा अच्छा होता है कि वे कुछ पृष्ठभूमि जानकारी प्राप्त करें और आगे क्या हो सकता है और क्या नहीं है इसके उदाहरण। उस भावना में: मुझे लगता है, अगर kwargs.get("errormessage", 17)उसका मूल्य वापस मिल सकता है या 17यदि गलतफहमी मौजूद नहीं है - लेकिन मुझे यकीन नहीं है। क्या वो सही है?
हनीबियर

आह हाँ यह करता है। यहां मिला । धन्यवाद ... बस यकीन करना चाहता था।
हनीबियर

21

DSM और Tadeck के उत्तर सीधे आपके प्रश्न का उत्तर देते हैं।

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

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

फिर:

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

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

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


यह दिखाने के लिए धन्यवाद कि कैसे डिफ़ॉल्ट मान असाइन किया जाए prefix
एचबीटी

11

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

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

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

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


3

एक तरीका यह है कि इसे खुद से जोड़ें! कैसे? 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, जिसमें वे सभी कुंजियाँ शामिल हैं जिनकी हम अपेक्षा कर रहे हैं। हम पहले यह देखने के लिए जांच करते हैं कि क्या कंवरों में कोई अप्रत्याशित चाबियाँ हैं या नहीं। फिर हम अपडेट argsकरते हैं kwargsजो उपयोगकर्ता द्वारा निर्धारित किए गए किसी भी नए मान को अधिलेखित कर देगा। यदि कोई कुंजी मौजूद है, तो हमें परीक्षण करने की आवश्यकता नहीं है, अब हम argsअपने तर्क शब्दकोश के रूप में उपयोग करते हैं और इसकी कोई आवश्यकता नहीं है kwargs


1

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

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

hello(what="world")

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.