** kwargs'da Bir Anahtarın Var olup olmadığını nasıl kontrol edebilirim?


111

Python 3.2.3. Burada listelenen bazı fikirler normal varyasyonlarda işe yarıyor, ancak görünüşe göre ** kwargs farklı kurallara göre oynuyor ... öyleyse bu neden çalışmıyor ve ** kwargs'ta bir anahtarın var olup olmadığını nasıl kontrol edebilirim?

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

Ayrıca bunun işe yarayacağını düşünüyorum, ama olmuyor -

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

Tahmin ediyorum çünkü kwargs tekrarlanabilir mi? Sadece belirli bir anahtarın orada olup olmadığını kontrol etmek için bunu tekrar etmem gerekir mi?


4
Özel bir kural yok. Sadece alıntıları unuttun.
Lennart Regebro

Yanıtlar:


165

İstediğiniz

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

Değerini almak için errormessage

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

Bu şekilde, kwargssadece başka bir şey dict. İlk örneğiniz, if kwargs['errormessage']"kwargs'daki" hata mesajı "anahtarıyla ilişkili değeri alın ve ardından bool değerini kontrol edin" anlamına gelir. Yani böyle bir anahtar yoksa, bir KeyError.

Kişisel İkinci örnek, if errormessage in kwargs:, araçlar "eğer kwargstarafından adlandırılmış öğesi içeriyor" errormessage" ve 'sürece errormessage' bir değişken adıdır, bir elde edersiniz NameError.

Sözlüklerin aynı zamanda .get()varsayılan bir parametreyi kabul eden (kendisi varsayılan None) bir yönteme sahip olduğunu belirtmeliyim , böylece kwargs.get("errormessage")bu anahtar varsa ve Noneaksi halde değeri döndürür (benzer şekilde kwargs.get("errormessage", 17)düşündüğünüz şeyi yapar). Var olan anahtar ile Nonebir değer olarak sahip olunması veya anahtarın mevcut olmaması arasındaki farkı önemsemediğinizde , bu kullanışlı olabilir.


Ekstra açıklama için teşekkürler! Python'a yeni başlayanların bazı arka plan bilgileri ve neyin mümkün olup neyin mümkün olmadığına dair daha fazla örnek alması her zaman iyidir. Bu ruhla: Sanırım kwargs.get("errormessage", 17)değerini döndürebilir veya 17hata mesajı yoksa - ama emin değilim. Bu doğru mu?
Honeybear

Ah evet öyle. Buldum burada . Teşekkürler ... sadece emin olmak istedim.
Honeybear

21

DSM'nin ve Tadeck'in yanıtları sorunuzu doğrudan yanıtlar.

Komut dosyalarımda dict.pop()isteğe bağlı ve ek argümanlarla uğraşmak için genellikle uygun olanı kullanırım . İşte basit bir print()sarmalayıcı örneği :

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

Sonra:

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

Gördüğünüz gibi, içinde prefixyer almıyorsa kwargs, varsayılan ''(boş dize) yerel prefixdeğişkende saklanıyor demektir . Verilirse değeri kullanılır.

Bu genellikle herhangi bir işlev için sarmalayıcılar yazmak için kompakt ve okunabilir bir reçetedir: Her zaman sadece anlamadığınız ve var olup olmadıklarını bile bilmediğiniz doğrudan argümanlar. Her zaman geçmesine ederse *argsve **kwargssiz kod yavaş olun ve biraz daha yazarak gerektirir, ancak (bu durumda denilen fonksiyonun arayüzleri ise print) değiştirir, kodunuzu değiştirmeniz gerekmez. Bu yaklaşım, tüm arayüz değişikliklerini desteklerken geliştirme süresini azaltır.


Varsayılan değerin nasıl atanacağını gösterdiğiniz için teşekkür ederiz prefix.
HBat

11

Sadece bu:

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

Anahtarın sözlükte olup olmadığını kontrol etmelisiniz. Bunun sözdizimi some_key in some_dict( some_keyhashable olan bir şey olduğunda, mutlaka bir dizge değil).

Bağlandığınız fikirler ( bu fikirler ), locals()ve tarafından döndürülen sözlüklerde belirli bir anahtarın var olup olmadığını kontrol etmek için örnekler içeriyordu globals(). Örneğiniz benzer, çünkü kwargssözlükte belirli bir anahtarın varlığını kontrol ediyorsunuz (anahtar kelime argümanlarını içeren sözlük).


3

Bir yol, onu kendiniz eklemektir! Nasıl? kwargsBir grup temerrütle birleştirerek . Bu, her durumda uygun olmayacaktır, örneğin, anahtarlar önceden sizin tarafınızdan bilinmiyorsa. Ancak, eğer öyleyse, işte basit bir örnek:

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)

Varsayılanlar args, beklediğimiz tüm anahtarları içeren sözlükte ayarlanır . Önce kwarglarda beklenmedik anahtarlar olup olmadığını kontrol ederiz. Sonra güncellemek argsile kwargskullanıcı tarafından ayarlanan herhangi bir yeni değerlerin üzerine yazılacak olan. Bir anahtarın var olup olmadığını test etmemize gerek yok, şimdi argsargüman sözlüğümüz olarak kullanıyoruz ve daha fazla ihtiyacımız yok kwargs.


1

Bunları kendi başınıza kolayca keşfedebilirsiniz:

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

hello(what="world")

13
"Kolay" ı kaldırın ve daha iyi bir cevap. Herkes için kolay olsaydı, bu siteye ihtiyacımız olmazdı. inHiç programlamadıysanız ve / veya Python'da yeniyseniz, operatörü kendi içinde bulmak kolay değildir. Sadece dict.get()ve dict.setdefault()yardımında ima ediliyor .
cfi

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.