[python] argparse 선택적 인수가 설정되었는지 확인하십시오.

선택적 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_truestore_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