sys.argv[x]가 정의되었는지 확인하는 중
스크립트에 대해 변수가 전달되었는지 확인하는 가장 좋은 방법은 무엇입니까?
try:
sys.argv[1]
except NameError:
startingpoint = 'blah'
else:
startingpoint = sys.argv[1]
의 길이를 확인합니다.sys.argv
:
if len(sys.argv) > 1:
blah = sys.argv[1]
else:
blah = 'blah'
어떤 사람들은 당신이 제안한 예외 기반 접근법을 선호합니다(예:try: blah = sys.argv[1]; except IndexError: blah = 'blah'
), 하지만 저는 그것이 거의 "확장"되지 않고(예를 들어, 두 세 개의 주장을 수용하고 싶을 때) 잠재적으로 오류를 숨길 수 있기 때문에(예를 들어, 사용한 경우) 별로 좋아하지 않습니다.blah = foo(sys.argv[1])
,그렇지만foo(...)
을 높였습니다.IndexError
,그거IndexError
무시됨).
결국, 사이의 차이는try, except
및 테스트len(sys.argv)
그렇게 중요한 것은 아닙니다둘 다 에 비하면 좀 촌스러워요.
하지만 저는 이런 생각이 듭니다. 일종의 저예산 논쟁으로 말이죠.
arg_names = ['command', 'x', 'y', 'operation', 'option']
args = dict(zip(arg_names, sys.argv))
당신은 그것을 심지어 생성하는 데 사용할 수 있습니다.namedtuple
기본값을 사용하여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
지정된 인수 이름에 사전에 연결된 값이 없을 때 기본값을 반환합니다.
제가 아직 목록에서 보지 못한 또 다른 방법은 당신의 보초 값을 미리 설정하는 것입니다.이 방법은 Python의 게으른 평가를 활용합니다. Python은 항상 다음을 제공할 필요가 없습니다.else
진술.예:
startingpoint = 'blah'
if len(sys.argv) >= 2:
startingpoint = sys.argv[1]
또는 CRAGY 구문을 사용할 경우 Python의 3차 연산자를 사용할 수 있습니다.
startingpoint = sys.argv[1] if len(sys.argv) >= 2 else 'blah'
나는 이것을 사용합니다 - 그것은 절대 실패하지 않습니다.
startingpoint = 'blah'
if sys.argv[1:]:
startingpoint = sys.argv[1]
이것은 평범한 파이썬 목록입니다.예외적으로 인덱스 오류가 발생하지만 길이만 확인하는 것이 좋습니다.
if len(sys.argv) >= 2:
startingpoint = sys.argv[1]
else:
startingpoint = 'blah'
지도 내장 기능으로 작동하는 솔루션!
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":
...
원조자가 하려고 했던 것에 상당히 가깝습니다.사용하는 기능은 다음과 같습니다.
def get_arg(index):
try:
sys.argv[index]
except IndexError:
return ''
else:
return sys.argv[index]
따라서 사용법은 다음과 같습니다.
if __name__ == "__main__":
banner(get_arg(1),get_arg(2))
argv[1]의 값을 argv에 추가하기만 하면 argv[1]가 입력한 문자열과 동일하지 않은지 확인할 수 있습니다. 예:
from sys import argv
argv.append('SomeString')
if argv[1]!="SomeString":
print(argv[1])
언급URL : https://stackoverflow.com/questions/5423381/checking-if-sys-argvx-is-defined
'sourcecode' 카테고리의 다른 글
Python Requests 패키지:xml 응답 처리 (0) | 2023.07.22 |
---|---|
CreateDatabase를 사용하여 봄부터 utf8mb4 문자 집합으로 데이터베이스를 만드는 방법존재하지 않는 경우? (0) | 2023.07.22 |
Mariadb가 filesort에서 가끔 충돌함 (0) | 2023.07.22 |
Apple Java 사용자 확인으로 로그인 (0) | 2023.07.22 |
C++의 짧은 형식 "if"와 동등한 파이썬 (0) | 2023.07.22 |