Как мне вернуть выражение в Python

#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 . Добавьте его в мой ответ.