2016-03-09 40 views
0

数量我在我的代码的结构如下:减少参数的函数发生在蟒蛇

#!/usr/bin/env python 
import <something> 
. 
. 
. 
from modules import * 
from optparse import OptionParser 

class Main: 
    def __init__(self): 
     parser = self.get_argument() 
     self.set_argument(parser) 

    def my_args(self): 
     parser = OptionParser(usage='usage: %prog [options]', version='%prog 1.0.0') 
     parser.add_option('-t', '--test', action='store_true', dest='test', default=False, 
      help='Help of test.') 
     . 
     . 
     . 
     return parser 

    def set_args(self, parser) 
     options, args = parser.parse_args() 
     params = dict(test=options.test, ..., arg100=options.arg100) 
     self.start(**params) 

    def start(self, **params): 
     print params 


    def ...: 
     ... 
    . 
    . 
    . 

if __name__ == '__main__': 
    Main() 

我想运行开始为越来越参数和值使用其他功能。但:

TypeError: start() takes exactly 2 arguments (1 given) 

如何使用kwargs传递它们?

什么是使用start中的参数的最佳方法。 我真的很新kwargs

+0

你是如何调用'开始()'方法?如果我使用上面写的'start()'方法,它不会出错,只是打印出一个空字典。 –

+0

赦免,是的。你是对的。我如何使用kwargs来传递它们? – MLSC

+0

开始是定义采取kwargs或关键字参数,因为你把**放在params前面,然后在set_args中定义参数,但是你通过了测试,甚至没有声明,你也没有传递任何关键字参数。我不知道你是否在另一个地方声明了另一个'test'。您可能想要解决这些问题。 –

回答

0

下面的工作对我来说:

class Test(object): 

    def a(self): 
     p = {"a":1, "b":2} 
     self.start(**p) 

    def start(self, **params): 
     print(params) 


t = Test() 
t.a() 

结果是:

{'a': 1, 'b': 2} 
1

**kwargs允许一个函数采取关键字参数,构造一个字典

In [3]: def g(**kw): 
...:  print(kw) 
...:  

In [4]: g(a=1, b=2, c=3) 
{'a': 1, 'c': 3, 'b': 2} 

如果你想传递一个字典的功能,你需要解压词典,像这样:

In [5]: d = dict(e=42, f=65) 

In [6]: g(**d) 
    {'e': 42, 'f': 65} 

http://pythontips.com/2013/08/04/args-and-kwargs-in-python-explained/,或official documentation

+0

如何更改此代码并使用kwargs传递参数? – MLSC

+0

对不起,我最初误读了这个问题。更新。 –

+0

请参阅update,当我调用'self.start(** params)'时,错误是'TypeError:start()需要2个参数(1给出)'' – MLSC