#python #sqlalchemy
#python #sqlalchemy
Вопрос:
У меня есть функция, которая принимает странный аргумент из-за **kwargs
def create_record_table(Base, table_name, **kwargs):
class RecordTable(Base):
__tablename__ = table_name
id = Column(Integer, primary_key=True)
for key, value in kwargs.items():
exec("{0} = {1}".format(key,value))
return RecordTable
вот пример того, как кто-то вызывает эту функцию
test = create_record_table(Base, "testtable", index="Column(String)")
Я хотел бы создать функцию или класс, который создает или возвращает index="Column(String)"
часть.
например, пользователь может сделать это
index = Atomic("col_name", "String")
test = create_record_table(Base, "testtable", index)
или аналогично:
index = Atomic("col_name", "Integer")
test = create_record_table(Base, "testtable", index)
Ответ №1:
Как насчет:
def Atomic(col_name, col_type):
return {'index': '%s(%s)' % (col_name, col_type)}
И затем вам нужно вызвать create_record_table
вот так:
kwargs = Atomic('testcol', 'String')
create_record_table(Base, 'testtable', **kwargs)
Если вы не хотите добавлять **
before kwargs
при вызове create_record_table
, вы можете изменить объявление create_record_table
на this:
def create_record_table(Base, table_name, kwargs):
Теперь вы можете вызвать его следующим образом:
kwargs = Atomic('testcol', 'String')
create_record_table(Base, 'testtable', kwargs)
Но таким образом это сделает create_record_table
несовместимым старый код.
Комментарии:
1. Это не сработало. Ошибка типа: create_record_table() принимает ровно 2 аргумента (задано 4)
2. Извините, что забыл упомянуть, что вам нужно изменить способ вызова
create_record_table
. Добавьте его в мой ответ.