[英]Python : class definition with **kwargs
尝试实例化以下类时,我收到以下错误:
"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)
为了传递schema
并将其解压缩到**kwargs
,你必须使用**schema
:
db_create_table('Table1', **schema)
说明:单个星号形式( *args
)解包序列以形成参数列表,而双星号形式( **kwargs
)将类似dict的对象解压缩到keyworded参数列表。
没有任何星号,给定的对象将直接传递,而不进行任何解包。
函数中的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的关键字参数。
你传递了两个args ,但只是抓住了kwargs 。
schema
作为位置参数传递,该参数将被*args
捕获; 如果你想让它被**kwargs
捕获,你必须将它作为关键字参数传递:
db_create_table('Table1', schema=schema)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.