web-dev-qa-db-ja.com

引数を反復処理する方法

私はそのようなスクリプトを持っています:

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

引数とその値を反復処理する方法は?

44
user3654650

名前空間オブジェクトを反復処理する場合は、「vars」を追加してください:

 for arg in vars(args):
     print arg, getattr(args, arg)
69
James Sapam

Namespace オブジェクトは反復可能ではありません。標準ドキュメントでは、辞書が必要な場合は次のことを行うことを推奨しています。

>>> vars(args)
{'foo': 'BAR'}

そう

for key,value in vars(args).iteritems():
    # do stuff

正直に言うと、なぜ引数を反復処理するのかわからない。それは引数パーサーを持つという目的を幾分打ち負かします。

19

_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

7
hpaulj

パーサーからの_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」に変更できます。

2
BoboDarph

args.__dict__を使用しています。これにより、基になるdict構造にアクセスできます。次に、単純なキーと値の反復:

for k in args.__dict__:
  print k, args.__dict__[k]
2
mork

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.

そして、そのように使用されることは想定されていません。あなたのユースケースを検討してください、ドキュメントでは、argparsesys.argv。つまり、これらの引数を反復処理する必要はありません。

0
Victor Wong