Python:我应该使用eval、exec还是。。?

Python:我应该使用eval、exec还是。。?,python,exec,eval,Python,Exec,Eval,我试图使以下陈述更加灵活: for posting in page.findAll(attrs = {"id": re.compile(r'''post\d+''')}): 以下部分从CSV文件中动态检索并存储在字符串中(例如,名为test的字符串)。CSV存储在安全位置,仅管理员可以访问 attrs = {"id": re.compile(r'''post\d+''')} 我可以通过使用eval(test)或exec(test)而不是仅仅使用test来集成变量吗 for posting i

我试图使以下陈述更加灵活:

for posting in page.findAll(attrs = {"id": re.compile(r'''post\d+''')}):

以下部分从CSV文件中动态检索并存储在字符串中(例如,名为test的字符串)。CSV存储在安全位置,仅管理员可以访问

attrs = {"id": re.compile(r'''post\d+''')}
我可以通过使用eval(test)或exec(test)而不是仅仅使用test来集成变量吗

for posting in page.findAll(test)):

如果要从用户输入运行代码(输入文件内容),则需要使用这些名称或其他名称来执行
eval
exec
(具体来说,对于语句,您需要
exec
——赋值是一条语句)


但是你不想(也不应该)这样做,因为那是邪恶的、不安全的、完全不必要的等等。放弃赋值(只存储dict)和
re.compile
调用,然后你可以在上面使用
ast.literal\u eval
,这样你就相当安全了(您仍然应该捕获语法错误和其他可能出现错误的内容,以显示合理的错误消息,但恶意代码应该几乎不可能,而且不会那么脏)。如果需要,可以在加载后应用
re.compile

两者都不是-这是Python-您可以编写一系列命名参数和所需值来调用函数作为字典。在这种情况下,键“attrs”的值也是字典。只需在“**”前面加上前缀即可调用该函数时,将字典名称更改为:

test= {"attrs": {\"id\": re.compile(r'''post\d+''')} }

for posting in page.findAll(**test}):
   (...)

除非您完全无法控制CSV源代码,否则请不惜一切代价避免此类加载

  • 使用
    pickle
    模块将正则表达式保存为序列化数据(或者更好,只保存字符串)
  • 使用
    JSON
    模块将数据保存为JSON
  • 使用
    csv
    模块将其写入文件
然后执行相反的操作,从文件中获取数据

如果无法控制CSV生成,请尝试使用
split
re
模块手动提取数据

eval
exec
是“最后的解决方案”。除非你没有其他方法,否则不要使用它们。

最安全的方法是:

您可以将其用作:

some_function_or_method(**args)

@user620007:首先,你可以省略“亲爱的”和“谢谢”。它们没有帮助。真的。省略这个并不粗鲁。第二,请看你的问题。“粗体”事情没有起作用,是吗?请更新您的问题以使其更清楚。第三,欢迎这样做。新鲜血液对社区有好处,即使您还不知道我们的所有怪癖。问题是如何从文件动态加载
attrs
,而不是解压字典。那么,填充数据有什么问题作为字典中文件数据的字符串?CSV存储在一个安全的位置,仅管理员可以访问。@user620007:您是构建系统的管理员,还是只是试图与其他人的系统交互?
some_function_or_method(**args)