- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我一直在尝试让 Python3 的 ast.literal_eval() 函数工作(在交互式 Python session 中),但是——我阅读了它的文档描述——我做不到。
我的目标是替换这个:
>>> import logging
>>> eval('logging.DEBUG')
10
有了更安全的选择,这个:
>>> import logging, ast
>>> ast.literal_eval('logging.DEBUG')
Traceback (most recent call last):
...
ValueError: malformed node or string: <_ast.Attribute object at 0x7f1ccc55eeb8>
但后者不起作用(至少不是我的使用方式)。请注意,我还尝试了三重引号 和原始字符串 变体。
我相信我只是在这里遗漏了一个细微差别(例如,它可能不喜欢在模块中评估常量)。来自关于 ast.literal_eval() 的 Python-3 文档:
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.
感谢任何帮助。 =:) 提前谢谢您!
最佳答案
根据您在评论中给出的上下文,我建议您不要这样做:
ast.literal_eval
因为 logging.Debug
不是乱码:您从模块中请求一个值,这可能会产生任意副作用我的建议是使用 map :
log_levels = { 'DEBUG': logging.DEBUG, ... }
当您稍后从您的配置文件中读取log_level
(比如 DEBUG)时,您只需执行以下操作:
real_level = log_levels[log_level]
这样你就可以很容易地用 real_level = log_levels[log_level.upper()]
接受大小写错误,如果配置文件中有一个意外的值,你只会得到一个 KeyError
异常,没有不需要的评估的风险。
关于python - 协助 Python 的 ast.literal_eval ('a_string' ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36337082/
我一直在尝试让 Python3 的 ast.literal_eval() 函数工作(在交互式 Python session 中),但是——我阅读了它的文档描述——我做不到。 我的目标是替换这个: >>
我是一名优秀的程序员,十分优秀!