11

関数呼び出しで要求されるよりも多くのkwargsを関数に送信する方法はありますか?

例:

def mydef(a, b):
    print a
    print b

mydict = {'a' : 'foo', 'b' : 'bar'}
mydef(**mydict)    # This works and prints 'foo' and 'bar'

mybigdict = {'a' : 'foo', 'b' : 'bar', 'c' : 'nooooo!'}
mydef(**mybigdict)   # This blows up with a unexpected argument error

mybigdictエラーなしで 渡す方法はありますか?'c'私の理想的な世界では決して使用されmydefず、無視されるだけです。

おかげで、私の掘り出し物は私が探しているものを思い付いていません。

編集:コードを少し修正しました。これmydef(a, b, **kwargs)は私が探していたフォームでしたが、inspect関数argsは私にとっては新しいものであり、間違いなく私のツールボックスにとっては何かでした。みんな、ありがとう!

4

2 に答える 2

19

いいえ、関数定義で(**kwargsキャッチオール構文を使用して)より多くのパラメーターが許可されていない限り、定義されているよりも多くの引数を使用してメソッドを呼び出すことはできません。

関数をイントロスペクトして、受け入れない引数を削除することはできますが、次のようになります。

import inspect

mybigdict = {'a2' : 'foo', 'b2' : 'bar', 'c2' : 'nooooo!'}
argspec = inspect.getargspec(mydef)
if not argspec.keywords:
    for key in mybigdict.keys():
        if key not in argspec.args:
            del mybigdict[key]
mydef(**mybigdict)

inspect.getargspec()この関数を使用して、呼び出し可能オブジェクトが**kwargキャッチオールをサポートしているかどうかを確認しています。サポートさ.keywordsれていない場合は、この情報を使用して.args、メソッドがサポートしていないものをすべて削除します。

于 2012-08-23T14:17:47.227 に答える
9

Martijn Pietersの答えを明確にするため(明確にするため)。関数のシグネチャを次のように変更すると、次のようになります。

def mydef(a, b, **kwargs):

これは、署名を変更しないと不可能であることを意味します。しかし、それが問題でなければ、うまくいくでしょう。

于 2012-08-23T14:22:06.130 に答える