如何在Python中将字符串转换为对象?
我正在做一个Django论坛项目,里面有一个叫“settings”的应用,它用来访问一个名为settings的数据库表。
这个表有三个列:verbose_name
、name
和value
。第一个是给管理员显示的名字,第二个是用来访问这个设置的名字(同时也是这个表的主键)。
现在,我有一些设置是布尔值,有一些是整数,还有一些是字符串。不过,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
所以我有两个问题:
- 有没有更好的方法来处理这个问题?
- 我怎么判断一个字符串是否包含整数?我知道如果它是有效的,我可以用
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