6

我有一个对象,它接受一个函数名 func、args 和 kwargs,并在某些时候运行

func(*args, **kwargs)

问题是,如果 func 不需要 args/kwargs,则 args/kwargs 默认为 None,这会导致 TypeError。例如,如果函数不需要参数,则 args、kwargs 默认为 None:

def test():
    pass

args = None

kwargs = None

test(*args, **kwargs)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-b9618694fbf2> in <module>()
----> 1 test(*args, **kwargs)

TypeError: test() argument after ** must be a mapping, not NoneType

我确信有一种很好的方法可以解决这个问题,而无需级联 if 语句检查 args/kwargs 是否存在,每个语句都有自己的函数调用,但我不确定如何。主要目标是将函数及其未知参数传递给对象,然后该对象将在稍后的方法中使用它们。

编辑:为清楚起见添加了一个示例

4

2 回答 2

10

问题是,如果 func 不需要 args/kwargs,则 args/kwargs 默认为 None,这会导致 TypeError。

这不是真的:

def func1(*args, **kwargs)
    print args, kwargs

将打印

() {}

相反,

def func2(): pass

可以完美地调用

func2(*(), **{})

所以只要改变你的argskwargs变量就可以了。

于 2013-07-26T15:18:31.570 回答
2

避免默认你的argsandkwargsNone.

  • args应该是一个元组:args = ()
  • kwargs应该是字典:kwargs = {}
于 2013-07-26T15:20:45.990 回答