2015-11-09 2 views
2

Вопрос: Учитывая экземпляр парсера argparse с добавленными аргументами, существует ли способ удалить/удалить аргумент, определенный для него?Как удалить аргумент из пространства имен

Почему: Учитывая Exemple ниже:

>>>import argparse 
>>>parser = argparse.ArgumentParser() 
>>>parser.add_argument('--imagePath', action = "store", default = 'toto') 
_StoreAction(option_strings=['--imagePath'], dest='imagePath', nargs=None, const=None, default='toto', type=None, choices=None, help=None, metavar=None) 
>>>args = parser.parse_args() 
>>>args 
Namespace(imagePath='toto') 
>>>parser.add_argument('--resultPath', action = "store", default = 'titi') 
_StoreAction(option_strings=['--resultPath'], dest='resultPath', nargs=None, const=None, default='titi', type=None, choices=None, help=None, metavar=None) 
>>>args = parser.parse_args() 
>>>args 
Namespace(imagePath='toto', resultPath='titi') 

Если мы, в сценарии, измените значение args.imagePath?

Я не нашел способ изменения значения, но если я могу удалить/удалить аргумент imagePath, можно было бы снова определить imagePath с новым значением!

+0

Почему вы 'parse_args', а затем меняете определения аргументов? – user2357112

+0

Зачем игнорировать входные параметры? Вы на самом деле * хотите * удалить параметр или просто заменить его значение (а если первое, то почему бы просто не проигнорировать его)? – jonrsharpe

+0

В большом скрипте существует множество возможных аргументов с некоторыми связанными. Я просто добавляю новый аргумент, но, в зависимости от его ценности, мне нужно динамически, в полете менять ценность для других. hpaulj дал правильный способ сделать это правильно – servoz

ответ

5

Вобще:

args.imagePath = 'newvalue' 

args является argparse.Namespace объектом. Это простой класс, который просто добавляет метод отображения - то, что вы видите с print(args). В противном случае все обычные методы объекта Python работают. Таким образом, вы можете выбирать, устанавливать и даже добавлять атрибуты по желанию.

parser пытается свести свои предположения об объекте пространства имен к минимуму. Он использует наиболее общие методы доступа - hasattr, getattr, setattr.

например.

dest = 'imagePath' 
value = 'newvalue' 
setattr(args, dest, value) 

Вы также можете удалить, например.

del args.imagePath 
delattr(args, 'imagePath') 

У меня возникает соблазн изменить название на «Как удалить аргумент из пространства имен». Я не думаю, что вы хотите удалить аргумент (действие, созданное add_argument) из самого parser. Основное внимание уделяется пространству имен, создаваемому разбором.

+0

Отлично! Большое спасибо hpaulj, вы точно поняли, в чем была моя проблема, и что мне нужно было исправить! Очень ясный ответ! Действительно, хорошим заголовком будет «Как удалить аргумент из пространства имен». Еще раз спасибо ! – servoz

Смежные вопросы