Проверка если системы.argv [x] определяется
что было бы лучшим способом проверить, была ли передана переменная для скрипта:
try:
sys.argv[1]
except NameError:
startingpoint = 'blah'
else:
startingpoint = sys.argv[1]
8 ответов:
в конце концов, разница между
try, except
и тестированияlen(sys.argv)
это не так уж и важно. Они оба немного хакерские по сравнению сargparse
.это происходит со мной, хотя - как своего рода малобюджетный argparse:
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
чтобы вернуть значение по умолчанию, если имя аргумента не имеет соответствующего значения в словаре.
проверьте длину
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
будет игнорироваться).
еще один способ, который я еще не видел, - это установить значение sentinel заранее. Этот метод использует преимущества ленивой оценки Python, в которой вам не всегда нужно предоставлять
else
заявление. Пример:startingpoint = 'blah' if len(sys.argv) >= 2: startingpoint = sys.argv[1]
или если вы собираетесь синтаксис сумасшедший вы могли бы использовать Python в тернарный оператор:
startingpoint = sys.argv[1] if len(sys.argv) >= 2 else 'blah'
Это обычный список Python. Исключение, которое вы поймали бы для этого, - это IndexError, но вам лучше просто проверить длину.
if len(sys.argv) >= 2: startingpoint = sys.argv[1] else: startingpoint = 'blah'
Я использую это - он никогда не подводит:
startingpoint = 'blah' if sys.argv[1:]: startingpoint = sys.argv[1]
решение, работающее с картой встроенный 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": ...