Python:我应该使用eval,exec还是..?

4

我正在尝试使以下语句更加灵活:

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)):

2
首先,您可以省略“亲爱的”和“谢谢”。它们没有帮助。真的。省略这些并不失礼。其次,请看看你的问题。加粗的事情没有起作用,对吧?请更新你的问题,使其更清晰明了。 - S.Lott
7
欢迎来到SO。新鲜血液对社区来说很好,即使你还不了解我们所有的怪癖。 - nmichaels
4个回答

5
如果您想要运行用户输入的代码(文件内容是输入),您将需要evalexec,可以使用这些名称或其他一些名称(具体来说,您需要exec用于语句 - 赋值是一个语句)。
但是,您不想(也不应该)这样做,因为那是邪恶的、不安全的、完全没有必要的等等。放弃赋值(只需存储字典)和re.compile调用,然后您可以在其上使用ast.literal_eval,非常安全(您仍应捕获语法错误和其他可能出错的东西以显示合理的错误消息,但恶意代码应该几乎不可能,而且它并不那么肮脏)。如果您认为需要,可以在加载后应用re.compile

1

最安全的是ast.literal_eval()

>>> args = ast.literal_eval('{"a":1}')
>>> args
{'a': 1}

您可以将其用作:

some_function_or_method(**args)

1

除非您完全无法控制CSV源,否则请尽一切可能避免这种类型的加载。

  • 使用pickle模块将正则表达式保存为序列化数据(或更好地,只保存字符串)
  • 使用json模块将数据保存为JSON格式
  • 使用csv模块将其写入文件

然后执行相反的操作以从文件中获取数据。

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

evalexec是“最后的解决方案”。除非没有其他方法,否则请避免使用它们。


CSV文件存储在安全位置,只有管理员可以访问。 - user620007
@user620007:你是在构建系统的管理员,还是只是尝试与别人的系统进行接口? - Thomas K

0

这不是 - 这是 Python - 你可以编写一系列命名参数和所需的值作为字典来调用函数。在这种情况下,一个值为键“attrs”的字典也是一个字典。只需在调用函数时在字典名称前加上 "**":

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

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

问题是关于从文件动态加载attrs,而不是关于解包字典。 - user395760
那么,将字典中的数据以字符串形式从文件中填充有什么问题呢? - jsbueno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接