如何在Python中将字符串评估为对象?

时间:2013-02-01 15:52:33

标签: python django types

我正在创建一个Django论坛项目,我有一个“设置”应用程序,可以访问数据库中的一个名为settings的表。

该表格设置为verbose_namenamevalue列。第一个是向管理员显示的名称,第二个是访问该设置的名称(并且是表中的主键。)

现在,我有一些设置是布尔值,有些是整数,有些是字符串。但是,value是数据库中的TEXT类型,因此Django将其作为字符串返回。现在我有这个实现将booleans转换为Python布尔类型:

class SettingsMiddleware:
    def process_request(self, request):
        request.settings = {}
        settings = Setting.objects.all()

        for setting in settings:
            if setting.value == ("True" or "1"):
                setting.value = True
            if setting.value == ("False" or "0"):
                setting.value = False

            request.settings[setting.name] = setting.value

        return None

所以我有两个问题:

  1. 有更好的方法可以解决这个问题吗?
  2. 如何确定字符串是否包含整数?我知道如果它有效,我可以将它转换为int()的整数,但是如何判断它是否有效?
  3. 显然,对于第二个问题,我会删除当前评估中的“1”和“0”位。

3 个答案:

答案 0 :(得分:2)

在我看来,ast.literal_eval可能对您有用。

>>> import  ast
>>> ast.literal_eval("1")
1
>>> ast.literal_eval("0")
0
>>> ast.literal_eval("True")
True
>>> ast.literal_eval("False")
False
>>> ast.literal_eval("'foobar'")
'foobar'
>>> ast.literal_eval("1.2")
1.2
>>> ast.literal_eval("1.2e3")
1200.0
>>> ast.literal_eval("1,2")
(1, 2)
>>> ast.literal_eval("[1,2]")
[1, 2]
>>> ast.literal_eval("[1,2,(1,2)]")
[1, 2, (1, 2)]
>>> ast.literal_eval("1f")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/ast.py", line 49, in literal_eval
    node_or_string = parse(node_or_string, mode='eval')
  File "/usr/local/lib/python2.7/ast.py", line 37, in parse
    return compile(source, filename, mode, PyCF_ONLY_AST)
  File "<unknown>", line 1
    1f
     ^
SyntaxError: unexpected EOF while parsing

答案 1 :(得分:1)

如果你想将它限制为0,1,True,False,我会做

boolmapping = {'0':False, 'False': False, '1':True, 'True':True}
...
setting = boolmapping.get(setting, setting)

但是,这可能会错误地将碰巧为1的整数转换为True,而真正意味着1,因此您可以更好地将“1”映射到1,而不是True

要将字符串转换为int(如果为1),请执行

try:
    setting = int(setting)
except ValueError:
    pass

答案 2 :(得分:0)

您可以简单地使用:

if setting.value in ["true", "True", 1, "1"]:
    setting.value = True