Проверка если системы.argv [x] определяется


что было бы лучшим способом проверить, была ли передана переменная для скрипта:

try:
    sys.argv[1]
except NameError:
    startingpoint = 'blah'
else:
    startingpoint = sys.argv[1]
8 59

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":
        ...

вы можете просто добавить значение argv[1] к argv, а затем проверить, не равен ли argv[1] введенной строке пример:

from sys import argv
argv.append('SomeString')
if argv[1]!="SomeString":
            print(argv[1])

довольно близко к тому, что автор пытался сделать. Вот функция, которую я использую:

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))