将列表传递给 exec 并填充它

pass list to exec and fill it

我有以下内容,但似乎不太正确:

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 函数中以便填充它。目前它 returns 为空,而该块确实正确地抓取了数据。似乎 newsItems 没有看到范围。

将对象作为局部或全局传递:

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

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

演示:

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