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


112

선택적 argparse 인수가 사용자에 의해 설정되었는지 확인하고 싶습니다.

isset을 사용하여 안전하게 확인할 수 있습니까?

이 같은:

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

이것은 float / int / string 유형 인수에 대해 동일하게 작동합니까?

기본 매개 변수를 설정하고 확인할 수 있습니다 (예 : myArg = -1 설정, 문자열의 경우 ""또는 "NOT_SET"). 그러나 궁극적으로 사용하려는 값은 나중에 스크립트에서 계산됩니다. 따라서 기본값으로 -1로 설정 한 다음 나중에 다른 것으로 업데이트합니다. 이것은 단순히 사용자가 값을 설정했는지 확인하는 것과 비교할 때 약간 어색해 보입니다.


1
무엇일까요 isset()(힌트 : Python은 PHP가 아닙니다)? hasattr()대신에, 아마도 그랬습니까 ? 대신 옵션에 대한 기본값을 설정하도록 argparse를 구성하지 않는 이유는 무엇입니까?
Martijn Pieters

@MartijnPieters-네, 사실입니다. 그래서 간단하게 확인할 수 있습니다 (args.myArg)의 경우 : ...
마들렌 P. 빈센트

답변:


146

선택적 인수 (로 지정 --)가 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

"is None"및 "is not None"테스트는 내가 원하고 기대하는대로 정확하게 작동합니다. 감사.
마들렌 P. 빈센트

39
불행히도 작동하지 않으면 인수가 default값을 정의했습니다.
kcpr

6
을 설정하려는 경우 문서에 설명 대로 값을 default설정 nargs='?'하고 제공 할 수 있습니다 . arg가 없으면 사용하고, 값없이 arg가 주어지면 사용되며, 그렇지 않으면 주어진 값이 사용됩니다. 단으로 하고 , 특정되지 않은 경우, 사용 가치하여 w / o 달리 지정된 값을 부여하는 경우. constdefaultconstdefaultnargs='?'defaultNone
요안 Filippidis

@IoannisFilippidis를 사용 action= "store_true"하거나 action="store_const", const="yourconst"해당 인수를 사용하여 다른 값을 저장할 수없는 경우. 기본값을 사용할 때는 작동하지 않습니다. 내 자신은 argparser에서 모든 기본값을 제거하고 def defaults():내가 원하는 순서대로 ConfigParser, ArgumentParser 및 기본값을 혼합하는 다른 함수 내부에서 모두 처리했습니다
m3nda

@ erm3nda 설정에 대해 언급하지 않았습니다 action. 대답은 action. 언급 한 작업은 관찰 한대로 특정 방식으로 작동하도록 문서화되어 있습니다. 하지만 액션을 정의 할 필요는 없습니다.
요안 Filippidis

37

@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.


22

옵션 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

이것은 Python 3.7.5 (Anaconda)에서 작동하지 않습니다. 결과를 얻었습니다testfoo.py: error: argument --foo: expected one argument
Mike Wise

당신이 사용하려는 경우 @MikeWise --foo값 (즉없이 1내 예), 당신은 지정해야 nargs=0에서 add_argument기능.
Erasmus Cedernaes

답변에 지정된대로 코드를 복사하여 붙여 넣었습니다. 편집해야할까요? 나는 action='store_true'실제 코드에서 대신 아래 답변 을 사용했습니다 .
Mike Wise

@MikeWise로 스크립트를 실행 했 python argparse_test.py --foo 1습니까?
Erasmus Cedernaes

11

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. 여기 문서에서 이러한 옵션에 대해 자세히 알아 보세요.


1
이것은 값이있는 인수가 설정되었는지 여부를 알기 위해 해결되지 않습니다. 여기서 주된 문제는 args 값이 defaul = ""에서 왔는지 아니면 사용자가 제공했는지 아는 것입니다.
m3nda

5

인수가 위치 (즉, "-"또는 "-"접두사, 인수, 일반적으로 파일 이름 만 있음) 인 경우 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')

3

다음은 내가 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

이것은 내가 내 프로그램을 위해 사용하고 조정 한 위의 대답에 대한 더 많은 통찰력을 줄 수 있습니다.


0

@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

0

매우 간단합니다. 'args = parser.parse_args ()'로 args 변수를 정의한 후에는 args 하위 집합 변수의 모든 데이터도 포함합니다. 'action = "store_true"가 사용되었다고 가정하고 변수가 설정되었는지 여부를 확인하려면 ...

if args.argument_name:
   # do something
else:
   # do something else
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.