【问题标题】:Pythonic way to convert the string "None" to a proper None将字符串“None”转换为正确的 None 的 Pythonic 方法
【发布时间】:2014-12-16 09:17:35
【问题描述】:

我可以创建一个 if 语句,打赌可能有更好的方法。

【问题讨论】:

  • 字符串究竟是从哪里来的,为什么它不只是 None 对象呢?你真正想做什么?例如,如果您想将 Python 数据保存到文件中并稍后读取,则可能有比您尝试组合的任何内容更好的选择。
  • 好吧,我知道这听起来很奇怪。简而言之,我正在从 URL 读取数据,需要将值为 None 的参数转换为实际的 NoneType。我确信可能有更好的方法来做到这一点,但这些部分是我无法控制的。

标签: python nonetype


【解决方案1】:

你可以使用ast.literal_eval:

In [6]: import ast

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

但是,如果您只需将 'None' 转换为 Noneif-statementternary expression 会更快:

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

【讨论】:

  • 谢谢!这正是我想要的。
  • @unutbu,你刚刚让我很开心:x = None if x == 'None' else x。
【解决方案2】:

更简洁,

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

虽然计算表达式 is kinda... eh

如果你有兴趣,基本上,如果你在生产中使用它,比如在网络服务器上,并且有人提交了一些最终通过 eval() 的东西(以表单或其他方式),他们基本上会有访问在您的服务器上运行的具有直接写入访问权限的有限版本的 python shell。

例如,根据您导入的内容,即使 Web 服务器代码中的 eval() 不直接评估提交的文本,随着时间的推移,他们也可以弄清楚如何通过诸如此类的好东西发送,

eval(subprocess.call('sudo rm -rf /')),擦除你的服务器,

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

eval(subprocess.call('ls -R -a /')) 列出服务器上的每个文件,然后您可以将其通过管道传输到一个文件中并使用 curl 将其发送给您自己。

所以,至少可以这么说,这可能很危险。

【讨论】:

  • 是的,在这种情况下,我正在阅读第三方 API,因此可能很危险。但在其他情况下,它可能很有用。谢谢!
猜你喜欢
  • 2010-11-05
  • 2014-07-11
  • 1970-01-01
  • 2017-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
相关资源
最近更新 更多