1. ホーム
  2. python

[解決済み] 関数が受け取るキーワード引数をリストアップできますか?

2022-05-17 21:33:45

質問

キーワード引数としてキー/値を渡す必要があるdictを持っています。例えば...

d_args = {'kw1': 'value1', 'kw2': 'value2'}
example(**d_args)

これは問題なく動作します。 しかし が受け入れない値が d_args ディクショナリにある場合、それは example 関数によって受け入れられなかった場合、それは明らかに死にます。例えば、例の関数が次のように定義されているとします。 def example(kw2):

の生成のどちらかを制御しないので、これは問題です。 d_args の生成、あるいは example 関数のようなものです。どちらも外部モジュールから来たものであり example はディクショナリからキーワード引数のいくつかを受け取るだけです。

理想を言えば、私は

parsed_kwargs = feedparser.parse(the_url)
valid_kwargs = get_valid_kwargs(parsed_kwargs, valid_for = PyRSS2Gen.RSS2)
PyRSS2Gen.RSS2(**valid_kwargs)

私はおそらく、有効なキーワード引数のリストから、dictをフィルタリングするだけでしょうが、私は疑問に思っていました。 特定の関数が取るキーワード引数をプログラム的にリストアップする方法はありますか?

どのように解決するのですか?

コードオブジェクトを直接検査して変数を調べるよりも、inspect モジュールを使用した方が少しはましです。

>>> import inspect
>>> def func(a,b,c=42, *args, **kwargs): pass
>>> inspect.getargspec(func)
(['a', 'b', 'c'], 'args', 'kwargs', (42,))

もし、特定の引数で呼び出せるかどうかを知りたい場合は、すでに指定されたデフォルトのない引数が必要です。 これらは、以下のようにして得ることができます。

def getRequiredArgs(func):
    args, varargs, varkw, defaults = inspect.getargspec(func)
    if defaults:
        args = args[:-len(defaults)]
    return args   # *args and **kwargs are not required, so ignore them.

それから、あなたの特定のdictから何が足りないかを伝える関数は

def missingArgs(func, argdict):
    return set(getRequiredArgs(func)).difference(argdict)

同様に、無効な引数をチェックする場合、使用します。

def invalidArgs(func, argdict):
    args, varargs, varkw, defaults = inspect.getargspec(func)
    if varkw: return set()  # All accepted
    return set(argdict) - set(args)

そして、それが呼び出し可能かどうかの完全なテストは、:

def isCallableWithArgs(func, argdict):
    return not missingArgs(func, argdict) and not invalidArgs(func, argdict)

(これはpythonのargパースに関する限りにおいてのみ有効です。 kwargsの無効な値に対するいかなる実行時のチェックも明らかに検出できません)