답변:
결국 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무시 될 것이다)를.
try, except. 조항이 foo나올 때까지 당신의 주장을 기다리 십시오 else.
argparse.
argparse.py내 명령 줄 모든 프로젝트에.
try절 에 넣습니다 . 따라서 더 어렵지 않다는 점을 감안할 때 (그리고 IMO는 조금 더 예쁘다) 길이 만 확인하는 것이 좋습니다 (또한 흐름 제어에 예외를 사용하는 것에 대해 소리 치십시오).
try사과입니다. 인정해야합니다. 나는 그것이 때때로 if진술 보다 더 명확하게 내 의도를 표현한다고 느낍니다 .
내가 아직 보지 못한 또 다른 방법은 미리 센티넬 값을 설정하는 것입니다. 이 방법은 항상 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]
startingpoint예제에서 변수를 제거 할 수 있지만 질문은 대체 변수를 할당하는 것이므로 방금 동일하게 만들었습니다.
sys.argv[1:]:. 이것은 위치 인수와 함께 작동하지만 count는 그렇지 않습니다.
argv [1]의 값을 argv에 추가 한 다음 argv [1]이 입력 한 문자열과 같지 않은지 확인할 수 있습니다. 예 :
from sys import argv
argv.append('SomeString')
if argv[1]!="SomeString":
print(argv[1])