2016-03-09 41 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