如何将参数列表传递给Python中的另一个函数?

时间:2013-01-09 00:31:59

标签: python argv optparse kwargs

使用optparse,我想将选项列表参数列表与我调用add_option()的地方分开。如何将文件A中的东西打包(然后在文件B中解压缩)以便这可以工作? parser_options.append()行不会像写的那样工作......

档案A:

import file_b
parser_options = []
parser_options.append(('-b', '--bootcount', type='string', dest='bootcount', default='', help='Number of times to repeat booting and testing, if applicable'))
parser_options.append(('-d', '--duration', type='string', dest='duration', default='', help='Number of hours to run the test.  Decimals OK'))

my_object = file_b.B(parser_options)

文件B接收parser_options作为输入:

import optparse
class B:
    def __init__(self, parser_options):
        self.parser = optparse.OptionParser('MyTest Options')
        if parser_options:
            for option in parser_options: 
                self.parser.add_option(option)

* 编辑:已修复使用ojbects

3 个答案:

答案 0 :(得分:0)

不是试图将你的选项套入某些数据结构,而是在文件A中定义一个向你提供的解析器添加选项的函数不是更简单吗?

档案A:

def addOptions(parser):
    parser.add_option('-b', '--bootcount', type='string', dest='bootcount', default='', help='Number of times to repeat booting and testing, if applicable')
    parser.add_option('-d', '--duration', type='string', dest='duration', default='', help='Number of hours to run the test.  Decimals OK')

档案B:

import optparse
def build_parser(parser_options):
    parser = optparse.OptionParser('MyTest Options')
    if parser_options:
        parser_options(parser)

别处:

import file_a
import file_b
file_b.build_parser(file_a.addOptions)

答案 1 :(得分:0)

你遇到的问题是你试图在元组中传递关键字参数。代码('-b', '--bootcount', type='string', dest='bootcount', default='', help='Number of times to repeat booting and testing, if applicable')仅在函数调用中合法,而不是其他任何地方。 type='string'位在元组中是不合法的!

如果要传递函数参数,则需要使用列表或元组作为位置参数,并使用字典作为关键字参数。这是通过更改包含args元组和kwargs字典的元组的单个元组来实现此目的的一种方法:

parser_options = []
parser_options.append((('-b', '--bootcount'),
                       dict(type='string', dest='bootcount', default='',
                            help='Number of times to repeat booting and testing, if applicable')))
parser_options.append((('-d', '--duration'),
                       dict(type='string', dest='duration', default='',
                            help='Number of hours to run the test.  Decimals OK')))

在你的另一个文件中,你可以使用***运算符将元组和dict的内容传递给相应的函数来解压缩参数:

class B:
    def __init__(self, parser_options)
        self.parser = optparse.OptionParser('MyTest Options')
        if parser_options:
            for args, kwargs in parser_options: 
                self.parser.add_option(*args, **kwargs)

答案 2 :(得分:0)

我最终将解析器传递给构造中的对象,这很好,因为我可以从调用模块命名它:

import optparse
parser = optparse.OptionParser('My Diagnostics')
parser.add_option('-p', '--pbootcount', type='string', dest='pbootcount', default='testing1234', help=' blah blah')
c = myobject.MyObject(parser)