Bagaimana Cara Memeriksa Apakah Ada Kunci di ** kwargs?

111

Python 3.2.3. Ada beberapa ide yang tercantum di sini , yang bekerja pada var biasa, tetapi tampaknya ** kwargs bermain dengan aturan yang berbeda ... jadi mengapa ini tidak berhasil dan bagaimana saya bisa memeriksa untuk melihat apakah ada kunci di ** kwargs?

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

Saya juga berpikir ini seharusnya berhasil, tetapi tidak -

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

Saya menebak karena kwargs dapat diulang? Apakah saya harus mengulanginya hanya untuk memeriksa apakah ada kunci tertentu?

Zamphatta
sumber
4
Tidak ada aturan khusus. Anda baru saja lupa kutipannya.
Lennart Regebro

Jawaban:

164

Kamu ingin

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

Untuk mendapatkan nilai errormessage

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

Dengan cara ini, kwargshanyalah hal lain dict. Contoh pertama Anda if kwargs['errormessage'],, berarti "dapatkan nilai yang terkait dengan kunci" errormessage "di kwargs, lalu periksa nilai bool-nya". Jadi jika tidak ada kunci seperti itu, Anda akan mendapatkan KeyError.

Contoh kedua Anda if errormessage in kwargs:,, berarti "jika kwargsberisi elemen yang dinamai oleh" errormessage", dan kecuali" errormessage"adalah nama variabel, Anda akan mendapatkan NameError.

Saya harus menyebutkan bahwa kamus juga memiliki metode .get()yang menerima parameter default (dengan sendirinya default None), sehingga kwargs.get("errormessage")mengembalikan nilai jika kunci itu ada dan Nonesebaliknya (juga kwargs.get("errormessage", 17)melakukan apa yang mungkin Anda pikirkan). Jika Anda tidak peduli tentang perbedaan antara kunci yang ada dan yang memiliki Nonenilai atau kunci yang tidak ada, ini bisa berguna.

DSM
sumber
Terima kasih atas penjelasan ekstra! Selalu baik bagi pendatang baru python untuk mendapatkan beberapa info latar belakang dan contoh lebih lanjut tentang apa yang mungkin dan apa yang tidak. Dalam semangat itu: Saya pikir, kwargs.get("errormessage", 17)mungkin mengembalikan nilainya atau 17jika pesan kesalahan tidak ada - tapi saya tidak yakin. Apakah itu benar?
Honeybear
Ah ya benar. Ketemu di sini . Terima kasih ... hanya ingin memastikan.
Honeybear
21

Jawaban DSM dan Tadeck menjawab pertanyaan Anda secara langsung.

Dalam skrip saya, saya sering menggunakan kemudahan dict.pop()untuk menangani argumen opsional, dan tambahan. Berikut contoh print()pembungkus sederhana :

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

Kemudian:

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

Seperti yang Anda lihat, jika prefixtidak ada di dalamnya kwargs, maka default ''(string kosong) disimpan di prefixvariabel lokal . Jika diberikan, maka nilainya digunakan.

Ini umumnya adalah resep yang ringkas dan dapat dibaca untuk menulis pembungkus untuk segala jenis fungsi: Selalu sampaikan argumen yang tidak Anda pahami, dan bahkan tidak tahu apakah argumen itu ada. Jika Anda selalu melewatinya *argsdan **kwargsmembuat kode Anda lebih lambat, dan membutuhkan lebih banyak pengetikan, tetapi jika antarmuka dari fungsi yang dipanggil (dalam hal ini print) berubah, Anda tidak perlu mengubah kode Anda. Pendekatan ini mengurangi waktu pengembangan sekaligus mendukung semua perubahan antarmuka.

cfi
sumber
Terima kasih telah menunjukkan cara menetapkan nilai default ke prefix.
HBat
11

Hanya ini:

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

Anda perlu memeriksa, apakah kuncinya ada di kamus. Sintaksnya adalah some_key in some_dict(di mana some_keyada sesuatu yang dapat dicirikan, tidak harus berupa string).

Ide-ide yang telah Anda hubungkan ( ide-ide ini ) berisi contoh-contoh untuk memeriksa apakah ada kunci spesifik dalam kamus yang dikembalikan oleh locals()dan globals(). Contoh Anda serupa, karena Anda memeriksa keberadaan kunci tertentu dalam kwargskamus (kamus yang berisi argumen kata kunci).

Tadeck
sumber
3

Salah satu caranya adalah dengan menambahkannya sendiri! Bagaimana? Dengan menggabungkan kwargsdengan banyak default. Ini tidak selalu sesuai di semua kesempatan, misalnya, jika kunci tidak diketahui sebelumnya. Namun, jika ya, berikut adalah contoh sederhananya:

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)

Standarnya disetel dalam kamus args, yang menyertakan semua kunci yang kami harapkan. Kami pertama kali memeriksa untuk melihat apakah ada kunci yang tidak terduga di kwargs. Kemudian kita update argsdengan kwargsyang akan menimpa nilai-nilai baru bahwa pengguna telah ditetapkan. Kami tidak perlu menguji apakah ada kunci, kami sekarang menggunakan argssebagai kamus argumen kami dan tidak membutuhkan lagi kwargs.

cdarke.dll
sumber
1

Anda dapat menemukan hal-hal itu dengan mudah sendiri:

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

hello(what="world")
Christian Thieme
sumber
13
Hapus "mudah" dan kemudian itu jawaban yang lebih baik. Jika mudah untuk semua orang, maka kami tidak membutuhkan situs ini. Menemukan inoperator itu sendiri tidaklah mudah jika Anda belum pernah memprogram dan / atau baru mengenal Python. Ini hanya diisyaratkan dalam dict.get()dan dict.setdefault()bantuan.
cfi
1
if kwarg.__len__() != 0:
    print(kwarg)
YeongHwa Jin
sumber