gpt4 book ai didi

python - 协助 Python 的 ast.literal_eval ('a_string' )

转载 作者:太空狗 更新时间:2023-10-30 02:57:38 24 4
gpt4 key购买 nike

我一直在尝试让 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 不是乱码:您从模块中请求一个值,这可能会产生任意副作用
  • 您不应对从外部文件读取的值使用 eval。

我的建议是使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com