스크립트에 변수가 전달되었는지 확인하는 가장 좋은 방법은 무엇입니까?
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])