将字符串"None"转为正确的None的Pythonic方法

18 投票
2 回答
23656 浏览
提问于 2025-04-28 18:07

我可以写一个if语句,但可能还有更好的方法。

暂无标签

2 个回答

10

更简洁地说,

>>> type(eval('None'))
<class 'NoneType'>

虽然使用表达式的评估 有点... 危险是的

如果你感兴趣,简单来说,如果你在生产环境中使用它,比如在一个网络服务器上,假设有人提交了一些内容(比如在表单中),这些内容最终通过 eval() 被处理,那么他们实际上就能获得一个有限版的 Python 终端,能够直接在你的服务器上写东西。

举个例子,取决于你导入了什么,即使在网络服务器的代码中,eval() 并没有直接评估提交的文本,随着时间的推移,他们可能会找到办法发送一些危险的命令,比如,

eval(subprocess.call('sudo rm -rf /')),这会清空你的服务器,

eval(sys.exit()) 会停止网络服务器,

还有 eval(subprocess.call('ls -R -a /')) 会列出服务器上的所有文件,然后他们可以把这些信息保存到一个文件中,再用 curl 发送给自己。

所以,至少可以说,这样做是非常危险的。

40

你可以使用 ast.literal_eval 这个方法:

In [6]: import ast

In [7]: ast.literal_eval('None') is None
Out[7]: True

不过,如果你只是想把 'None' 转换成 None,那么用 if语句 或者 三元表达式 会更快:

x = None if x == 'None' else x

撰写回答