[解決済み] 関数が受け取るキーワード引数をリストアップできますか?
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の無効な値に対するいかなる実行時のチェックも明らかに検出できません)
関連
-
[解決済み] リスト内のアイテムのインデックスを検索する
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] 割り当て後にリストが予期せず変更されました。その理由と防止策を教えてください。
-
[解決済み] リストを均等な大きさの塊に分割するには?
-
[解決済み] リストの最後の要素を取得する方法
-
[解決済み] リスト項目の出現回数を数えるにはどうしたらいいですか?
-
[解決済み] バッチファイルに引数を渡すにはどうしたらいいですか?
-
[解決済み] Celeryでタスクのステータスを確認するには?
-
[解決済み] なぜPython 3.5はPython 3.4に比べてstr.translateがずっと速いのですか?
-
[解決済み] pandas DataFrameへのメタ情報/メタデータの追加
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Python関数の引数の数を調べるにはどうしたらいいですか?
-
[解決済み] Spyderを仮想環境で動作させるには?
-
[解決済み] Pythonでzip(*[iter(s)]*n)はどのように動作するのですか?
-
[解決済み] IPythonの終了確認を無効にする
-
[解決済み] Pythonでnumpy.linalg.eigを使用した後の固有値と関連する固有ベクトルのソート
-
[解決済み] and "と "or "はブール値以外ではどのように作用するか?
-
[解決済み] TypeError: can't multiply sequence by non-int of type 'float'」と表示されるのはなぜですか?
-
[解決済み] pathlib.Pathオブジェクトの絶対パスを取得するには?
-
[解決済み] 条件を満たした場合にNumpyの要素を置き換える
-
[解決済み] Seleniumから要素の属性を取得するには?