Python:带有 **kwargs 的类定义

Pel*_*can 6 python oop instance

尝试实例化以下类时,出现以下错误:

"TypeError: __init__() takes exactly 2 arguments (3 given)"
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

glg*_*lgl 5

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

db_create_table('Table1', **schema)
Run Code Online (Sandbox Code Playgroud)

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

没有任何星号,给定的对象将按原样直接传递,无需任何解包。

另请参阅如何在 Python 中使用 *args 和 **kwargs

  • 详细说明这个答案,你也可以写(简化):`db_create_table('Table1', id=1, col1=2, col2=3, CreatedOn='2017-09')` (2认同)