argparse python中的钩子参数
我感兴趣的是将一个类中使用argparse解析的额外参数挂接到另一个类中的另一个方法,而另一个类中已经很少使用argparse模块解析参数argparse python中的钩子参数,python,inheritance,runtime,argparse,Python,Inheritance,Runtime,Argparse,我感兴趣的是将一个类中使用argparse解析的额外参数挂接到另一个类中的另一个方法,而另一个类中已经很少使用argparse模块解析参数 Project 1 def x(): parser = argparse.ArgumentParser() parser.add_argument('--abc') Project 2 def y(): parser = argparse.ArgumentParser() parser.add_argument('--t
Project 1
def x():
parser = argparse.ArgumentParser()
parser.add_argument('--abc')
Project 2
def y():
parser = argparse.ArgumentParser()
parser.add_argument('--temp1')
parser.add_argument('--temp2')
当我运行x()时,我想将“-abc”参数添加到参数y()的列表中,该参数在运行时为“temp1”、“temp2”。继承是定义相应构造函数的最佳方式吗?有人能提供一些示例代码片段吗
谢谢 你可以从Django的故事中得到启发。它们的基本设置如下:
- 入口点是
,它调用run_from_argv
,解析命令行,提取解析的参数并将它们提供给create_parser
李>execute
方法创建一个argparse解析器,并使用create_parser
预填充所有命令可用的默认选项。然后,该函数调用类的add_argument
方法,该方法将由子类重载李>add_arguments
方法负责处理与默认选项相关的各种行为。然后它调用execute
,这意味着子类要重载它来处理由handle
引入的特定选项add\u arguments
import argparse
import sys
class BaseParser:
def create_parser(self, progname):
parser = argparse.ArgumentParser(prog=progname)
parser.add_argument('--temp1')
parser.add_argument('--temp2')
self.add_arguments(parser)
return parser
def add_arguments(self, parser):
pass # to be optionnally defined in subclasses
def parse_command_line(self, argv):
parser = create_parser(argv[0])
options = parser.parse_args(argv[1:])
parsed_options = vars(options)
self.handle(**parsed_options) # HAS TO be defined in subclasses
class X(BaseParser):
def add_arguments(self, parser):
parser.add_argument('--abc')
def handle(self, **options):
abc = options['abc']
temp1 = options['temp1']
temp2 = options['temp2']
# do stuff with thoses variables
class Y(BaseParser):
def handle(self, **options):
temp1 = options['temp1']
temp2 = options['temp2']
# do stuff
x = X()
y = Y()
args = sys.argv
x.parse_command_line(args)
y.parse_command_line(args)
如果X是Y的子类,则可以进一步简化代码。
argparse
实现了一个parents
功能,可以将一个解析器的参数添加到另一个解析器。检查文档。或者根据您的情况:
parser_x = argparse.ArgumentParser(add_help=False)
parser_x.add_argument('--abc')
parser_y = argparse.ArgumentParser(parents=[parser_x])
parser_y.add_argument('--temp1')
parser_y.add_argument('--temp2')
parser_y.print_help()
印刷品:
usage: ipython [-h] [--abc ABC] [--temp1 TEMP1] [--temp2 TEMP2]
optional arguments:
-h, --help show this help message and exit
--abc ABC
--temp1 TEMP1
--temp2 TEMP2
需要使用add\u help=False
来避免解析器通常会添加的-h
与解析器y
获取的之间发生冲突
另一种方法是让x
将其参数添加到预定义的解析器中:
def x(parser=None):
if parser is None:
parser = argparse.ArgumentParser()
parser.add_argument('--abc')
return parser
def y():
....
return parser
parsery = y()
parserx = x(parsery)
知道add_argument
返回对其创建的参数(操作对象)的引用也可能很有用
parser = argparse.ArgumentParser()
arg1 = parser.add_argument('--abc')
在shell中执行此操作,您将看到arg1
显示为:
_StoreAction(option_strings=['--abc'], dest='abc', nargs=None,
const=None, default=None, type=None, choices=None,
help=None, metavar=None)
arg1
是一个可以放置在列表、字典中的对象。理论上,您甚至可以将其添加到另一个解析器中。这实际上就是父机制所做的(即,将操作引用从父机制复制到子机制)