Python的帮助ast.literal_评估('a_string')

2024-04-26 03:53:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在试着弄Pythonast.literal_评估()函数工作(在交互式Python会话中),但是——我读了它的文档描述——我不能。在

我的目标是取代这个:

>>> import logging
>>> eval('logging.DEBUG')
10

更安全的选择是:

^{pr2}$

但后者不起作用(至少我用不上)。请注意,我还尝试了三引号原始字符串变体。在

我相信我只是漏掉了一点细微差别(例如,它可能不喜欢计算模块中的常量)。来自Python-3文档的ast.literal_评估():

Safely evaluate an expression node or a string containing a Python literal or container display. The string or node provided may only consist of the following Python literal structures: strings, bytes, numbers, tuples, lists, dicts, sets, booleans, and None.

This can be used for safely evaluating strings containing Python values from untrusted sources without the need to parse the values oneself. It is not capable of evaluating arbitrarily complex expressions, for example involving operators or indexing.

感谢任何帮助。=:)提前谢谢!在


Tags: orofthe函数文档nodeforstring
1条回答
网友
1楼 · 发布于 2024-04-26 03:53:46

鉴于您在评论中给出的上下文,我建议您不要这样做:

  • 您不能使用ast.literal_eval,因为logging.Debug不是一个简单的:您从模块中请求一个值,这可能会产生任意的副作用
  • 对于从外部文件读取的值,不应使用eval。在

我的建议是使用地图:

log_levels = { 'DEBUG': logging.DEBUG, ... }

当您稍后从配置文件中读取log_level(比如DEBUG)时,只需执行以下操作:

^{pr2}$

这样您就可以很容易地接受real_level = log_levels[log_level.upper()]的大小写错误,如果配置文件中有一个意外的值,您只需得到一个KeyError异常,而不会有不必要的求值风险。在

相关问题 更多 >