私はそのようなスクリプトを持っています:
import argparse
parser = argparse.ArgumentParser(
description='Text file conversion.'
)
parser.add_argument("inputfile", help="file to process", type=str)
parser.add_argument("-o", "--out", default="output.txt",
help="output name")
parser.add_argument("-t", "--type", default="detailed",
help="Type of processing")
args = parser.parse_args()
for arg in args:
print(arg)
しかし、それは機能しません。エラーが発生します:
TypeError: 'Namespace' object is not iterable
引数とその値を反復処理する方法は?
名前空間オブジェクトを反復処理する場合は、「vars」を追加してください:
for arg in vars(args):
print arg, getattr(args, arg)
Namespace
オブジェクトは反復可能ではありません。標準ドキュメントでは、辞書が必要な場合は次のことを行うことを推奨しています。
>>> vars(args)
{'foo': 'BAR'}
そう
for key,value in vars(args).iteritems():
# do stuff
正直に言うと、なぜ引数を反復処理するのかわからない。それは引数パーサーを持つという目的を幾分打ち負かします。
後
_args = parser.parse_args()
_
引数を表示するには、次を使用します。
_print args # or print(args) in python3
_
args
オブジェクト(タイプ_argparse.Namespace
_)は反復可能ではありません(つまり、リストではありません)が、値を適切に表示する_.__str__
_メソッドがあります。
_args.out
_および_args.type
_は、定義した2つの引数の値を示します。これはほとんどの場合に機能します。 getattr(args, key)
は値にアクセスする最も一般的な方法ですが、通常は必要ありません。
_vars(args)
_
名前空間を辞書に変換します。辞書には、すべての辞書メソッドでアクセスできます。これはdocs
で綴られています。
ref:ドキュメントの名前空間段落- https://docs.python.org/2/library/argparse.html#the-namespace-object
パーサーからの_actionsの解析は、まともなアイデアのようです。 parse_args()を実行してから、ネームスペースからデータを選択する代わりに。
import argparse
parser = argparse.ArgumentParser(
description='Text file conversion.')
parser.add_argument("inputfile", help="file to process", type=str)
parser.add_argument("-o", "--out", default="output.txt",
help="output name")
parser.add_argument("-t", "--type", default="detailed",
help="Type of processing")
options = parser._actions
for k in options:
print(getattr(k, 'dest'), getattr(k, 'default'))
別のスクリプトのパラメーターの既定の既定値が必要な場合(関数のオプションを返すなど)、「dest」部分を「choices」に変更できます。
args.__dict__
を使用しています。これにより、基になるdict構造にアクセスできます。次に、単純なキーと値の反復:
for k in args.__dict__:
print k, args.__dict__[k]
ArgumentParser.parse_args
は、反復可能な配列の代わりにNamespace
オブジェクトを返します。
参考のため、 https://docs.python.org/3/library/argparse.html#parsing-arguments
ArgumentParser parses arguments through the parse_args() method. This will inspect the command line, convert each argument to the appropriate type and then invoke the appropriate action.
そして、そのように使用されることは想定されていません。あなたのユースケースを検討してください、ドキュメントでは、argparse
はsys.argv
。。つまり、これらの引数を反復処理する必要はありません。