如何在Python中将字符串转换为对象?

0 投票
3 回答
650 浏览
提问于 2025-04-17 14:27

我正在做一个Django论坛项目,里面有一个叫“settings”的应用,它用来访问一个名为settings的数据库表。

这个表有三个列:verbose_namenamevalue。第一个是给管理员显示的名字,第二个是用来访问这个设置的名字(同时也是这个表的主键)。

现在,我有一些设置是布尔值,有一些是整数,还有一些是字符串。不过,value在数据库中是TEXT类型,所以Django返回的都是字符串。目前我有一个实现,用来把布尔值转换成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()把它转换成整数,但我怎么判断它是否有效呢?

显然,关于第二个问题,我会去掉当前判断中的“1”和“0”部分。

3 个回答

0

你可以简单地使用:

if setting.value in ["true", "True", 1, "1"]:
    setting.value = True
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

如果你想把一个字符串转换成整数(前提是它确实是一个数字字符串),可以这样做:

try:
    setting = int(setting)
except ValueError:
    pass
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

撰写回答