2

argsコマンドラインをargparseで解析した後に名前空間があるとしましょう。これを使用して、次のようなオブジェクトを作成します。

foo = Foo(bar=args.bar)

残念ながら、キーワード引数が設定されている場合、それを設定してはならないという制限Noneがあります。ここで、args.barが設定されているかどうかを確認し、それに応じて行動する必要があります。

if args.bar:
    foo = Foo(bar=args.bar)
else:
    foo = Foo()

これは扱いにくく、より多くの引数に対応できません。私がしたいのは、次のようなものです:

foo = Foo(**args.__dict__)

しかし、これはまだ私の最初の問題に悩まされており、さらにメソッドのキーワード引数ではないキーでは機能しません__init__。これらのことを達成する良い方法はありますか?

4

2 に答える 2

3

次のようなことを試すことができます:

>>> defined_args = {k:v for k,v in args._get_kwargs() if v is not None}
>>> foo = Foo(**defined_args)

例えば:

>>> import argparse
>>> args = argparse.Namespace(key1=None,key2='value')
>>> {k:v for k,v in args._get_kwargs() if v is not None}
{'key2': 'value'}

ただし、これ_get_kwargs()はパブリック API の一部ではないため、将来のリリース/バージョンで利用できる場合と利用できない場合があることに注意してください。

于 2013-03-01T15:36:12.283 に答える