将列表传递给exec并填充它

时间:2015-11-21 15:05:26

标签: python python-3.x exec

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

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没有看到范围。

1 个答案:

答案 0 :(得分:2)

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

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

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

演示:

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