15

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

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)

4

2 回答 2

20
def SubClass(BaseClass):

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

class SubClass(BaseClass):
于 2012-12-16T01:51:15.997 回答
2

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

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

我的项目结构:

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

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

在 Module2.py 中,我有:

from package1 import Module1

假设这将导入其中的类。

尝试创建 Module2 类时收到意外的关键字参数错误

Mod2 = Module2(kw1=var1, kw2=var2)

通过使用修复

from package1.Module1 import Module1

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

希望这对其他人有帮助

于 2015-03-10T05:35:17.137 回答