Как изменить значение аргумента парсера в определенном диапазоне? - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь запустить этот кусок кода.Я хочу назначить разные значения FLAGS.Ncolor, как указано х.Но когда я запускаю этот код, он выбирает значение по умолчанию Ncolor, равное 2.

`p=argparse.ArgumentParser()
passes to add_argument()
p.add_argument('--Ncolor','-nc', default=2, type=int, help='Number of 
colors')
FLAGS=p.parse_args()
x = [ i+1 for i in range(5)]
for FLAGS.NCOLOR in x:
    print ("value is %d" % (FLAGS.Ncolor))`

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Ваш код после настройки синтаксического анализатора, по существу, выполняет:

In [195]: import argparse
In [196]: FLAGS = argparse.Namespace(Ncolor=2)
In [197]: FLAGS
Out[197]: Namespace(Ncolor=2)
In [198]: for FLAGS.NCOLOR in range(3):
     ...:     print(FLAGS)
     ...:     
Namespace(NCOLOR=0, Ncolor=2)
Namespace(NCOLOR=1, Ncolor=2)
Namespace(NCOLOR=2, Ncolor=2)

Использование FLAGS.NCOLOR в качестве переменной итерации не является нормальным, но оно работает - в некотором смысле.Он устанавливает атрибут Namespace.Но почему вы хотите это сделать?Обычно это работа метода parse_args.

for FLAGS.NCOLOR in ... работает, потому что оператор for присваивает значение FLAGS.NCOLOR, а FLAGS - это простой объектный класс, который принимает такое назначение.

Более нормальной итерацией будет:

In [199]: FLAGS = argparse.Namespace(Ncolor=2)
In [200]: for i in range(3):
     ...:     print(i, FLAGS, FLAGS.Ncolor)
     ...:     
0 Namespace(Ncolor=2) 2
1 Namespace(Ncolor=2) 2
2 Namespace(Ncolor=2) 2

, где i - временная переменная итерации (так же, как используется в вашем x=[] понимании списка.

0 голосов
/ 24 мая 2018

Вы, кажется, путаете переменные.FLAGS.Ncolor - это значение, указанное в командной строке.Например, FLAGS.Ncolor = 5 (значение по умолчанию в вашем коде будет 2).В приведенном выше коде я бы добавил переменную COLORS:

p=argparse.ArgumentParser()
p.add_argument('--Ncolor','-nc', default=2, type=int, help='Number of colors')
FLAGS=p.parse_args()
colors = [c for c in range(1,FLAGS.Ncolor+1)]
for c in colors:
    print ("value is %d" % c)

, чтобы вы получили список цветов с нужным количеством значений.

Я думаю, вы не правильно поняли, что делает argparse вкод и что вы получаете от p.parse_args ().Посмотрите argparse doc, например: ссылка

, если вы хотите добавить числа из командной строки напрямую, что вы могли бы сделать (обратите внимание на новый аргумент 'nargs = "+"' в add_argument ()):

p=argparse.ArgumentParser()
p.add_argument('--Ncolor','-nc', default=2, type=int, nargs='+',help='Number of colors')
FLAGS=p.parse_args()

for c in FLAGS.Ncolor:
    print ("value is %d" % c)

Надеюсь, что поможет

Затем вы можете сделать что-то подобное в CLI:

python your_script.py -nc 1 2 3 8 100 255

Best

...