IT story

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

hot-time 2020. 9. 11. 19:41
반응형

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

This might give more insight to the above answer which I used and adapted to work for my program.

참고URL : https://stackoverflow.com/questions/30487767/check-if-argparse-optional-argument-is-set-or-not

반응형