Проверка если системы.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": ...