Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
argparse python中的钩子参数_Python_Inheritance_Runtime_Argparse - Fatal编程技术网

argparse python中的钩子参数

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

我感兴趣的是将一个类中使用argparse解析的额外参数挂接到另一个类中的另一个方法,而另一个类中已经很少使用argparse模块解析参数

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
  • create_parser
    方法创建一个argparse解析器,并使用
    add_argument
    预填充所有命令可用的默认选项。然后,该函数调用类的
    add_arguments
    方法,该方法将由子类重载
  • execute
    方法负责处理与默认选项相关的各种行为。然后它调用
    handle
    ,这意味着子类要重载它来处理由
    add\u arguments
    引入的特定选项
您的需求并不完全清楚,但我认为在您的情况下,您不需要麻烦使用execute方法。我同意:

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
是一个可以放置在列表、字典中的对象。理论上,您甚至可以将其添加到另一个解析器中。这实际上就是父机制所做的(即,将操作引用从父机制复制到子机制)