python - 一种基于字符串构建类的更Pythonic的方法(如何不使用eval)

标签 python sqlobject

好的。

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

由于大约有 15-20 种不同类别的成分(全部由单独的 SQLObject 表示),我不想做一堆相关连接列,因为我很懒,而且看起来这不是“最好的”或“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()

如何在不使用 eval() 的情况下调用从 __class__.__name__ 获取的字符串引用的 SQLObject 类?或者这是使用 eval() 的合适位置吗? (我的心态是永远不适合使用 eval() ——但是,由于系统从不使用 eval() 中的任何最终用户输入看起来“安全”。)

最佳答案

通过名称获取全局值;使用:

globals()[self.inventory_type]

关于python - 一种基于字符串构建类的更Pythonic的方法(如何不使用eval),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8468691/

相关文章:

python - 以下节点链接

python - Django - 'module' 对象不可调用

python - SQL从BEGIN中获取数据; ...;结尾; python 中的 block

json - 从 SQLObject 创建 JSON 对象的更简单方法

python - 从游标创建临时表

python - 添加几个数字并以方程形式返回输出

python - PyQ:如何枚举展开表上的符号列?

python - 考虑 NaN 的 Numpy cumsum

mysql - 尝试使用 sqlobject 和 python 3 添加数据和查询 mysql 数据库

python - SQLObject - 更新多条记录