在构造函数中使用** kwargs时出现意外的关键字参数

时间:2012-12-16 01:49:44

标签: python

我很困惑。我正在尝试创建一个不关心任何关键字参数的子类 - 只是将它们一直传递给超类,并显式设置构造函数所需的一个参数。这是我的代码的简化版本:

class BaseClass(object):
    def __init__(self, required, optional=None):
        pass

def SubClass(BaseClass):
    def __init__(self, **kwargs):
        super(SubClass, self).__init__(None, **kwargs)

a = SubClass(optional='foo')  # this throws TypeError!?!??

失败
leo@loki$ python minimal.py
Traceback (most recent call last):
  File "minimal.py", line 9, in <module>
    a = SubClass(optional='foo')
TypeError: SubClass() got an unexpected keyword argument 'optional'

当方法有**kwargs

时,如何抱怨意外的关键字参数?

(Ubuntu上的Python 2.7.3)

2 个答案:

答案 0 :(得分:19)

def SubClass(BaseClass):

是一个函数,而不是一个类。没有错误,因为BaseClass可以是参数名称,并且允许嵌套函数。语法很有趣,不是吗?

class SubClass(BaseClass):

答案 1 :(得分:1)

在搜索完全相同的错误但不同原因的答案时偶然发现了这篇文章。

我解决了我的问题(python初学者错误),但我想我应该把它放在这里,以防它帮助其他人。

我的项目结构:

project\
--package1\
----Module1.py
----Module2.py
--package2\
...blah blah blah...

其中Module2扩展了Module1,类名与模块/文件名相同

在Module2.py中,我有:

from package1 import Module1

假设这会导入其中的类。

尝试创建Module2 Class

时收到意外的关键字参数错误
Mod2 = Module2(kw1=var1, kw2=var2)

使用

修复
from package1.Module1 import Module1

那是[package name].[module name] import [class name]

希望这有助于其他人