【问题标题】:pass list to exec and fill it将列表传递给 exec 并填写
【发布时间】:2015-11-21 15:05:25
【问题描述】:

我有以下内容,但似乎无法正确:

newsItems = []

dummy_exec_data = '''
    scraped_data = soup.select("div#content, div.gamma > a, a")

    for data in scraped_data:
        from bs4 import BeautifulSoup
        partial_soup = BeautifulSoup(str(data), "html.parser")
        title = partial_soup.a.text
        url   = partial_soup.a["href"]
        newsItems.append({"title":title, "url":url})
'''

exec(dummy_exec_data)
print(newsItems)

现在我想知道是否可以将 newsItems 传递给 exec 函数以便可以填充它。当前,当块正确抓取数据时,它返回空。好像 newsItems 没有看到范围。

【问题讨论】:

  • 我想你可以这样做exec(dummy_exec_data, globals(), locals())
  • @vaultah:globalslocals 参数的顺序错误。

标签: python python-3.x exec


【解决方案1】:

将对象作为本地或全局传入:

exec(dummy_exec_data, {}, {'newsItems': newsItems})

这会将名称作为locals 命名空间的一部分显式传递,以避免意外传递太多信息。

演示:

>>> newsItems = []
>>> exec('newsItems.append("foo")', {}, {'newsItems': newsItems})
>>> newsItems
['foo']

【讨论】:

  • 感谢您的回答,问题解决了。但是,我想知道,这是线程安全的吗?
  • @user1213904:没有比直接执行该代码更线程安全的了。不是真的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
  • 1970-01-01
  • 2019-06-07
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多