2011-02-16 106 views
4

我想作以下发言更加灵活:Python:我应该使用eval,exec还是..?

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)而不是仅仅测试来整合变量吗?

for posting in page.findAll(test)): 
+2

@ user620007:一。您可以省略“亲爱的”和“谢谢”。他们没有帮助。真。忽略这一点并不是无礼的。第二。请看你的问题。 “大胆”的东西没有用,是吗?请**更新**您的问题以使其更清楚。 – 2011-02-16 16:44:33

+7

三,欢迎来到SO。新鲜血液对社区有益,即使你还不了解我们所有的怪癖。 – nmichaels 2011-02-16 16:55:22

回答

5

如果你想从用户输入的运行代码(文件内容的输入),你需要evalexec,通过这些名字或其他一些(具体而言,你需要exec的语句 - 赋值是一个语句)。

但是你不想(也不应该)这样做,因为这是邪恶的,不安全的,完全不必要的等等。丢掉任务(只存储字典)和re.compile调用,然后你可以使用ast.literal_eval并且你很安全(你仍然应该捕获语法错误和其他所有可能出错以显示明智的错误消息,但恶意代码应该几乎不可能,而且几乎不会太脏)。如果您需要的东西,您可以在加载后应用re.compile

0

既不是 - 这是Python - 你可以编写一个命名参数和所需的值来调用函数作为字典。在这种情况下,键入“attrs”的字典也是字典。只需调用函数时,预先准备“**”的字典名称:

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

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

问题是关于从文件中动态加载`attrs`,而不是解压字典。 – delnan 2011-02-16 16:49:00

1

除非你有在CSV源完全没有控制,避免不惜一切代价这类负载。

  • 保存正则表达式的使用pickle模块seriliazed数据(或更好,只需保存字符串)
  • 使用csv模块
  • 使用 json模块
  • 写入到一个文件中保存的数据作为JSON

然后做相反的事情从文件中获取数据。

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

evalexec是'最后的机会解决方案'。避免使用它们,除非你没有别的办法。

1

最安全的是ast.literal_eval()

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

你可以使用它作为:

some_function_or_method(**args)