基于字符串构建类的更pythonic方法(如何不使用eval)

时间:2011-12-12 00:29:57

标签: python sqlobject

行。

所以我有一个数据库,我想存储对其他Python对象的引用(现在我用来存储啤酒配方成分的人员库存信息)。

由于大约有15-20种不同类别的成分(全部由单个SQLObjects表示),我不想做一堆RelatedJoin列,因为,好吧,我很懒,看起来它不是“最好的“或”pythonic“解决方案。

所以现在我正在这样做:

class Inventory(SQLObject):
    inventory_item_id = IntCol(default=0)
    amount = DecimalCol(size=6, precision=2, default=0)
    amount_units = IntCol(default=Measure.GM)
    purchased_on = DateCol(default=datetime.now())
    purchased_from = UnicodeCol(default=None, length=256)
    price = CurrencyCol(default=0)
    notes = UnicodeCol(default=None)
    inventory_type = UnicodeCol(default=None)

    def _get_name(self):
        return eval(self.inventory_type).get(self.inventory_item_id).name

    def _set_inventory_item_id(self, value):
        self.inventory_type = value.__class__.__name__
        self._SO_set_inventory_item_id(value.id)

请注意_get_name()方法中的ICKY eval()

如何在不使用__class__.__name__的情况下调用我从eval()获取的字符串引用的SQLObject类?或者这是否适合使用eval()? (我有点使用eval()永远不适合的心态 - 但是由于系统从未使用eval()中的任何最终用户输入,因此它似乎是“安全的”。)

1 个答案:

答案 0 :(得分:3)

按名称获取全局值;使用:

globals()[self.inventory_type]