Я работаю в предположении, что переключатели являются взаимоисключающими (в этом случае вы действительно хотите использовать взаимоисключающую группу аргументов ).
Вы хотите, чтобы действие argparser установило class . Если вашему параметру командной строки не нужно принимать никаких аргументов, тогда я бы использовал action="store_const"
здесь:
parser.add_argument(
'--classabc', dest="class_", const=ClassABC,
action="store_const")
parser.add_argument(
'--classxyz', dest="class_", const=ClassXYZ,
action="store_const")
При разборе вышеуказанные действия устанавливают args.class_
в ClassABC
или ClassXYZ
, когда используется тот или иной переключатель. Дайте классам метод класса или атрибут, чтобы определить, в какой раздел конфигурации искать, не указывайте эти имена жестко где-либо еще.
Например, если оба класса имеют атрибут config_section
(установлен 'ABC'
для ClassABC
и 'XYZ'
для ClassXZY
), то вы можете использовать этот атрибут в цикле создания экземпляров:
if args.class_:
for host in config.getList(class_.config_section, 'hosts'):
instance = args.class_(config.getConfig(class_.config_section, host), ...)
Идея состоит в том, чтобы не переключаться на основе args
атрибутов, вы можете оставить это значение на argparse
, так как оно уже определяет различные варианты для вас.
Если оба параметра командной строки требуют дополнительного аргумента, создайте пользовательский Action
подкласс :
class StoreClassAction(argparse.Action):
def __call__(self, parser, namespace, values, **kwargs):
setattr(namespace, self.dest, (self.const, values)
затем используйте это как:
parser.add_argument(
'--classabc', dest="class_", choices=['cmd'], const=ClassABC,
action=StoreClassAction)
parser.add_argument(
'--classxyz', dest="class_", choices=['cmd'], const=ClassXYZ,
action=StoreClassAction)
Теперь аргумент args.class_
установлен на (classobject, argumentvalue)
, поэтому вы можете использовать:
if args.class_:
cls, action = args.class_
for host in config.getList(cls.config_section, 'hosts'):
instance = args.class_(config.getConfig(cls.config_section, host), ...)
instance.action(action)