Saya memiliki dict, yang harus saya berikan kunci / nilai sebagai argumen kata kunci .. Misalnya ..
d_args = {'kw1': 'value1', 'kw2': 'value2'}
example(**d_args)
Ini berfungsi dengan baik, tetapi jika ada nilai di d_args dict yang tidak diterima oleh example
fungsi, itu jelas mati .. Katakanlah, jika fungsi contoh didefinisikan sebagaidef example(kw2):
Ini adalah masalah karena saya tidak mengontrol pembuatan d_args
, atau example
fungsi .. Keduanya berasal dari modul eksternal, dan example
hanya menerima beberapa argumen kata kunci dari dict ..
Idealnya saya akan melakukannya
parsed_kwargs = feedparser.parse(the_url)
valid_kwargs = get_valid_kwargs(parsed_kwargs, valid_for = PyRSS2Gen.RSS2)
PyRSS2Gen.RSS2(**valid_kwargs)
Saya mungkin hanya akan memfilter dict, dari daftar argumen kata kunci yang valid, tetapi saya bertanya-tanya: Apakah ada cara untuk mendaftar secara programatik argumen kata kunci yang dibutuhkan oleh fungsi tertentu?
inspect.getargspec(f)
tidak digunakan lagi sejak Python 3.0; metode modern adalahinspect.signature(f)
.co_varnames
pilihan, di sisi lain, tidak bekerja di kedua.Ini akan mencetak nama semua argumen yang bisa dilewati, kata kunci dan non-kata kunci:
Ini karena pertama
co_varnames
selalu parameter (selanjutnya adalah variabel lokal, sepertiy
pada contoh di atas).Jadi sekarang Anda bisa memiliki fungsi:
Yang kemudian bisa Anda gunakan seperti ini:
EDIT : Tambahan kecil: jika Anda benar-benar hanya membutuhkan argumen kata kunci dari suatu fungsi, Anda dapat menggunakan
func_defaults
atribut untuk mengekstraknya:Anda sekarang dapat memanggil fungsi Anda dengan argumen yang dikenal, tetapi kwarg yang diekstrak, misalnya:
Ini mengasumsikan bahwa
func
tidak menggunakan*args
atau**kwargs
sihir dalam tanda tangannya.sumber
Di Python 3.0:
sumber
Untuk solusi Python 3, Anda dapat menggunakan
inspect.signature
dan memfilter menurut jenis parameternya yang ingin Anda ketahui.Mengambil contoh fungsi dengan posisi atau kata kunci, hanya kata kunci, var posisi dan parameter kata kunci var:
Anda dapat membuat objek tanda tangan untuk itu:
dan kemudian filter dengan pemahaman daftar untuk mengetahui detail yang Anda butuhkan:
dan, demikian pula, untuk posisi var menggunakan
p.VAR_POSITIONAL
kata kunci dan var denganVAR_KEYWORD
.Selain itu, Anda dapat menambahkan klausa ke jika untuk memeriksa apakah ada nilai default dengan memeriksa apakah
p.default
samap.empty
.sumber
Memperluas jawaban DzinX:
sumber