オプションのargparse引数がユーザーによって設定されているかどうかを確認したいと思います。
Issetを使用して安全にチェックできますか?
このようなもの:
if(isset(args.myArg)):
#do something
else:
#do something else
これは、float/int/string型の引数でも同じように機能しますか?
デフォルトのパラメータを設定して確認することができます(たとえば、myArg = -1、または文字列の「」、または「NOT_SET」を設定します)。ただし、最終的に使用する値は、スクリプトの後半でのみ計算されます。したがって、デフォルトとして-1に設定し、後で別の値に更新します。これは、ユーザーが値を設定したかどうかを単純にチェックするのと比較すると、少し面倒です。
オプション引数(--
で指定)は、指定されていない場合は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
@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'
内部的にはparser
はseen_actions
のリストを保持し、「必須」および「相互排他的」テストに使用します。ただし、parse_args
以外では使用できません。
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
オプション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
引数が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')
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
これは、私のプログラムで使用するために使用し、適応させた上記の答えに対するより多くの洞察を与えるかもしれません。