【问题标题】:Reducing the number of parameters a function takes in python减少函数在python中接受的参数数量
【发布时间】:2016-03-09 08:19:44
【问题描述】:

我的代码中有以下结构:

#!/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()

我想运行 start 来获取参数及其值,以便在其他函数中使用。但是:

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

如何使用 kwargs 传递它们?

start 中使用参数的最佳方法是什么。 我对kwargs 很陌生。

【问题讨论】:

  • 如何调用start() 方法?如果我使用你上面写的start() 方法,它不会出错,只是打印出一个空字典。
  • 对不起,是的。你说的对。如何使用 kwargs 传递它们?
  • start 定义为采用 kwargs 或关键字参数,因为您将 ** 放在 params 前面,然后在 set_args 中定义 params 但您通过了测试,甚至没有声明并且您没有通过任何关键字参数。我不知道您是否在某处声明了另一个test。您可能想解决这些问题。

标签: python function parameter-passing keyword-argument


【解决方案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

【讨论】:

  • 如何更改此代码并使用 kwargs 传递参数?
  • 请看更新,当我调用self.start(**params)时,错误是TypeError: start() takes exactly 2 arguments (1 given)
  • 在调用start之前打印params会发生什么?
【解决方案2】:

以下对我有用:

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}

【讨论】:

    猜你喜欢
    • 2018-04-16
    • 2019-07-28
    • 2012-01-30
    • 2021-07-07
    • 2014-05-09
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    相关资源
    最近更新 更多