Python:使用** kwargs的类定义

时间:2017-09-14 07:47:31

标签: python oop instance

尝试实例化以下类时,我收到以下错误:

"TypeError: __init__() takes exactly 2 arguments (3 given)"

你知道会出现什么问题吗?这是类定义:

class db_create_table():
        '''
            doc here
        '''
        def __init__(self,TableName, **kwargs ):
            self.TableName = TableName
            for k,v in kwargs.iteritems():
                setattr(self, k, k)


schema =  {"id" : { "type":"Integer", "primary":"primary_key=True", "unique":"unique = True"},
           "col1" :  { "type":"String()", "primary":"primary_key=False", "unique":"unique = True"},
           "col2" :  { "type":"String()", "primary":"primary_key=False", "unique":"unique = False"},
           "col3" :  { "type":"String()", "primary":"primary_key=False", "unique":"unique = False"},
           "col4" :  { "type":"String()", "primary":"primary_key=False", "unique":"unique = False"},
           "CreatedOn" :  { "type":"DateTime", "primary":"", "unique":"unique = False"},
           "UpdatedOn" :  { "type":"DateTime", "primary":"primary_key=False", "unique":"unique = False"},
                            }


db_create_table('Table1', schema)

3 个答案:

答案 0 :(得分:4)

要传递schema并将其解压缩到**kwargs,您必须使用**schema

db_create_table('Table1', **schema)

<强>说明: 单个星号形式(*args)解包序列以形成参数列表,而双星号形式(**kwargs)将类似dict的对象解包为关键字参数列表。

没有任何星号,给定的对象将直接传递,而不进行任何解包。

另见how to use *args and **kwargs in Python

答案 1 :(得分:2)

函数中的 kwargs 参数是捕获关键字参数;你传递一个对象而不解包它。

您需要使用**传递它,因此它会被解压缩,或者将* args添加到函数定义中。例如,查看函数如何解释参数:

def func(*args, **kwargs):
    print args
    print kwargs

func(arg)
func(*arg)
func(*arg, keyword='key')

输出:

(('one', 'two'),)  -- passed as arg, single element
{}
('one', 'two')  -- passed as *arg - object is unpacked
{}
('one', 'two')
{'keyword': 'key'}  -- keyword arg looks like that

当您使用* args传递位置参数时,您可以在调用func时传递带有** kwargs的关键字参数。

答案 2 :(得分:0)

你传递了两个 args ,但只是抓住 kwargs
schema作为位置参数传递,由*args捕获;如果您希望**kwargs抓住它,则必须将其作为关键字参数传递:

db_create_table('Table1', schema=schema)