[python] sys.argv [x]가 정의되어 있는지 확인

스크립트에 변수가 전달되었는지 확인하는 가장 좋은 방법은 무엇입니까?

try:
    sys.argv[1]
except NameError:
    startingpoint = 'blah'
else:
    startingpoint = sys.argv[1]



답변

결국 try, except과 테스트 의 차이점은len(sys.argv) 는 그다지 중요하지 않습니다. 둘 다 argparse.

그러나 이것은 저예산 논쟁의 일종으로 나에게 발생합니다.

arg_names = ['command', 'x', 'y', 'operation', 'option']
args = dict(zip(arg_names, sys.argv))

namedtuple기본값 인 with 값 을 생성하는 데 사용할 수도 있습니다 None.

Arg_list = collections.namedtuple('Arg_list', arg_names)
args = Arg_list(*(args.get(arg, None) for arg in arg_names))

에 익숙하지 않은 경우 namedtuple에는 객체처럼 작동하는 튜플 일 뿐이므로 다음을 사용하여 해당 값에 액세스 할 수 있습니다.tup.attribute 구문 대신 구문을tup[0] .

따라서 첫 번째 줄은의 namedtuple각 값에 대한 값 으로 새 유형을 만듭니다 arg_names. 두 번째 줄은 args딕셔너리 의 값을 전달 하며을 사용 get하여 주어진 인수 이름이 사전에 관련 값이 없을 때 기본값을 반환합니다.


답변

길이 확인 sys.argv:

if len(sys.argv) > 1:
    blah = sys.argv[1]
else:
    blah = 'blah'

어떤 사람들은 귀하가 제안한 예외 기반 접근 방식을 선호 try: blah = sys.argv[1]; except IndexError: blah = 'blah'하지만 (예 :), 거의 “확장”되지 않기 때문에 (예 : 2 ~ 3 개의 인수를 받아들이고 싶을 때)별로 좋아하지 않습니다. 그것은 잠재적으로 (당신이 사용하는 경우, 예를 들어 오류를 숨길 수 blah = foo(sys.argv[1])있지만, foo(...)제기 IndexError하는, IndexError무시 될 것이다)를.


답변

내가 아직 보지 못한 또 다른 방법은 미리 센티넬 값을 설정하는 것입니다. 이 방법은 항상 else명령문 을 제공 할 필요가없는 Python의 지연 평가를 활용 합니다. 예:

startingpoint = 'blah'
if len(sys.argv) >= 2:
  startingpoint = sys.argv[1]

또는 CRAZY 구문을 사용하는 경우 Python의 삼항 연산자를 사용할 수 있습니다 .

startingpoint = sys.argv[1] if len(sys.argv) >= 2 else 'blah'


답변

나는 이것을 사용합니다-결코 실패하지 않습니다.

startingpoint = 'blah'
if sys.argv[1:]:
   startingpoint = sys.argv[1]


답변

평범한 파이썬 목록입니다. 이를 위해 잡을 수있는 예외는 IndexError이지만 대신 길이를 확인하는 것이 좋습니다.

if len(sys.argv) >= 2:
  startingpoint = sys.argv[1]
else:
  startingpoint = 'blah'


답변

지도 내장 fonction으로 작업하는 솔루션!

arg_names = ['command' ,'operation', 'parameter']
args = map(None, arg_names, sys.argv)
args = {k:v for (k,v) in args}

그런 다음 다음과 같이 매개 변수를 호출하면됩니다.

if args['operation'] == "division":
    if not args['parameter']:
        ...
    if args['parameter'] == "euclidian":
        ...


답변

argv [1]의 값을 argv에 추가 한 다음 argv [1]이 입력 한 문자열과 같지 않은지 확인할 수 있습니다. 예 :

from sys import argv
argv.append('SomeString')
if argv[1]!="SomeString":
            print(argv[1])