-1
在某些情况下,它可用于从Python脚本(可能来自不可信任的源)读取数据,并从中提取值。如何在不执行Python脚本的情况下提取变量?
尽管在大多数情况下XML/JSON/YAML/TOML等格式更适合,但有时候这样做有用。
如何从Python脚本中提取变量名&而不执行它?
(假设值结构不包含代码执行他们的创作)
在某些情况下,它可用于从Python脚本(可能来自不可信任的源)读取数据,并从中提取值。如何在不执行Python脚本的情况下提取变量?
尽管在大多数情况下XML/JSON/YAML/TOML等格式更适合,但有时候这样做有用。
如何从Python脚本中提取变量名&而不执行它?
(假设值结构不包含代码执行他们的创作)
这可以使用Python的AST模块来完成:
这个例子功能从文件中读取一个单一命名的变量。
当然这需要变量可以使用ast.literal_eval()
进行评估。
def safe_eval_var_from_file(mod_path, variable, default=None, *, raise_exception=False):
import ast
ModuleType = type(ast)
with open(mod_path, "r", encoding='UTF-8') as file_mod:
data = file_mod.read()
try:
ast_data = ast.parse(data, filename=mod_path)
except:
if raise_exception:
raise
print("Syntax error 'ast.parse' can't read %r" % mod_path)
import traceback
traceback.print_exc()
ast_data = None
if ast_data:
for body in ast_data.body:
if body.__class__ == ast.Assign:
if len(body.targets) == 1:
if getattr(body.targets[0], "id", "") == variable:
try:
return ast.literal_eval(body.value)
except:
if raise_exception:
raise
print("AST error parsing %r for %r" % (variable, mod_path))
import traceback
traceback.print_exc()
return default
# Example use, read from ourself :)
that_variable = safe_eval_var_from_file(__file__, "this_variable")
this_variable = {"Hello": 1.5, b'World': [1, 2, 3], "this is": {'a set'}}
assert(this_variable == that_variable)