web-dev-qa-db-ja.com

argparseオプション引数が設定されているかどうかを確認します

オプションのargparse引数がユーザーによって設定されているかどうかを確認したいと思います。

Issetを使用して安全にチェックできますか?

このようなもの:

if(isset(args.myArg)):
    #do something
else:
    #do something else

これは、float/int/string型の引数でも同じように機能しますか?

デフォルトのパラメータを設定して確認することができます(たとえば、myArg = -1、または文字列の「」、または「NOT_SET」を設定します)。ただし、最終的に使用する値は、スクリプトの後半でのみ計算されます。したがって、デフォルトとして-1に設定し、後で別の値に更新します。これは、ユーザーが値を設定したかどうかを単純にチェックするのと比較すると、少し面倒です。

80

オプション引数(--で指定)は、指定されていない場合はNoneに初期化されると思います。したがって、is not Noneでテストできます。以下の例を試してください:

import argparse as ap

def main():
    parser = ap.ArgumentParser(description="My Script")
    parser.add_argument("--myArg")
    args, leftovers = parser.parse_known_args()

    if args.myArg is not None:
        print "myArg has been set (value is %s)" % args.myArg
102
Honza Osobne

@Honzaが指摘しているように、is Noneは良いテストです。これはデフォルトのdefaultであり、ユーザーはそれを複製する文字列を提供できません。

別のdefault='mydefaultvalueを指定して、それをテストできます。しかし、ユーザーがその文字列を指定するとどうなりますか?それは設定としてカウントされますか?

default=argparse.SUPPRESSを指定することもできます。ユーザーが引数を使用しない場合、args名前空間に表示されません。しかし、テストはより複雑になる可能性があります。

args.foo # raises an AttributeError
hasattr(args, 'foo')  # returns False
getattr(args, 'foo', 'other') # returns 'other'

内部的にはparserseen_actionsのリストを保持し、「必須」および「相互排他的」テストに使用します。ただし、parse_args以外では使用できません。

27
hpaulj

store_trueおよびstore_false引数アクションオプションを使用して、オプションで渡されたフラグを確認できます。

import argparse

argparser = argparse.ArgumentParser()
argparser.add_argument('-flag', dest='flag_exists', action='store_true')

print argparser.parse_args([])
# Namespace(flag_exists=False)
print argparser.parse_args(['-flag'])
# Namespace(flag_exists=True)

このように、条件付きis not Noneによるチェックについて心配する必要はありません。 TrueまたはFalseを確認するだけです。これらのオプションの詳細については、ドキュメントを参照してください here

9
Harry Sadler

オプションdefault=argparse.SUPPRESSを使用するのが最も理にかなっていると思います。次に、引数がnot Noneであるかどうかを確認する代わりに、引数がinであるかどうかを確認します。

例:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--foo", default=argparse.SUPPRESS)
ns = parser.parse_args()

print("Parsed arguments: {}".format(ns))
print("foo in namespace?: {}".format("foo" in ns))

使用法:

$ python argparse_test.py --foo 1
Parsed arguments: Namespace(foo='1')
foo in namespace?: True
$ python argparse_test.py
Parsed arguments: Namespace()
foo in namespace?: False
8

引数がpositionalの場合(つまり、「-」または「-」の接頭辞がなく、引数のみ、通常はファイル名)それから nargsパラメーター を使用してこれを行うことができます:

parser = argparse.ArgumentParser(description='Foo is a program that does things')
parser.add_argument('filename', nargs='?')
args = parser.parse_args()

if args.filename is not None:
    print('The file name is {}'.format(args.filename))
else:
    print('Oh well ; No args, no problems')
5
yPhil

Argparse変数を使用しているかどうかを確認するためのソリューションを次に示します

import argparse

ap = argparse.ArgumentParser()
ap.add_argument("-1", "--first", required=True)
ap.add_argument("-2", "--second", required=True)
ap.add_argument("-3", "--third", required=False) 
# Combine all arguments into a list called args
args = vars(ap.parse_args())
if args["third"] is not None:
# do something

これは、私のプログラムで使用するために使用し、適応させた上記の答えに対するより多くの洞察を与えるかもしれません。

2
C.Radford