从没有字典的字符串形成变量

时间:2014-02-18 21:18:14

标签: python django

这可能有点重复,但我找不到符合我需求的解决方案。

我有一个构建django-tables2的函数。我将model_class的参数作为字符串传递。现在可以是“应用程序”,“数据库”或“项目”,但最终会有更多。为了配置表,我设置了:

table = DatabaseTable(assets)

我希望能够传入model_class,以便根据所获得的输入类型使表动态化。类似的东西:

table = model_class + Table(assets)(伪)

我不想对字典进行硬编码,因为我不确定最终会添加多少个值。我看到人们建议使用exec,但这些建议都是其他威胁谋杀这些人家庭的用户所遵循的。

2 个答案:

答案 0 :(得分:2)

在堆栈上已多次询问此问题并且答案总是相同的:当您想要名称和对象之间的关联时,一个显而易见的方法是使用字典。

  

我不想硬编码字典,因为我不知道有多少   最终会添加值。

所以你想避免像这样的情况

lookup = {'application': ApplicationTable, 
          'database': DatabaseTable, 
          'item': ItemTable}

因为您不想维护查找,对吧?这没关系,但是没有必要对这样的字典进行硬编码以动态检索对象。

如果您eval的工作正如您所说的那样,那么ApplicationTableItemtable等范围内的这些名称必须来自某处。由于我不知道它们的定义位置以及新的定位,我将假设它们是从名为MyTables

的模块导入的。
from MyTables import ApplicationTable, Itemtable, BlahTable ...

这里的技巧是使用模块本身的dict(读取:命名空间)。

import MyTables
my_string = 'item'
table = getattr(MyTables, my_string.capitalize() + 'Table')

答案 1 :(得分:0)

这是允许的吗?它有效。

table = eval(model_name.capitalize() + 'Table(assets)')
RequestConfig(request).configure(table)