선택적 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
.
답변
옵션 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
답변
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
. 여기 문서에서 이러한 옵션에 대해 자세히 알아 보세요.
답변
인수가 위치 (즉, “-“또는 “-“접두사, 인수, 일반적으로 파일 이름 만 있음) 인 경우 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
이것은 내가 내 프로그램을 위해 사용하고 조정 한 위의 대답에 대한 더 많은 통찰력을 줄 수 있습니다.
답변
@Honza Osobne의 (현재 승인 된) 답변에 대한 @kcpr의 의견을 해결하기 위해
불행히도 작동하지 않으면 인수가 기본값을 정의했습니다.
먼저 인수가 옵션을 Namespace
제공 하는 객체 abd default=argparse.SUPPRESS
(@hpaulj 및 @Erasmus Cedernaes 답변 및이 python3 doc 참조 )와 비교하여 제공되었는지 확인하고 제공 되지 않은 경우 기본값으로 설정할 수 있습니다.
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--infile', default=argparse.SUPPRESS)
args = parser.parse_args()
if 'infile' in args:
# the argument is in the namespace, it's been provided by the user
# set it to what has been provided
theinfile = args.infile
print('argument \'--infile\' was given, set to {}'.format(theinfile))
else:
# the argument isn't in the namespace
# set it to a default value
theinfile = 'your_default.txt'
print('argument \'--infile\' was not given, set to default {}'.format(theinfile))
용법
$ python3 testargparse_so.py
argument '--infile' was not given, set to default your_default.txt
$ python3 testargparse_so.py --infile user_file.txt
argument '--infile' was given, set to user_file.txt