sourcecode

sys.argv[x]가 정의되었는지 확인하는 중

codebag 2023. 7. 22. 10:00
반응형

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

반응형