【发布时间】:2014-10-19 17:56:44
【问题描述】:
我有一个递归脚本,它正在为汽车抓取 JSON 文件。在每个递归级别,它都会添加一个新变量,并将其(与其他值一起)传递给递归调用,每次都会获得越来越详细的信息。我尝试使用locals() 动态分配一个变量,但即使在调用之后它仍然是None(我记得看到有时locals() 是只读的)。
我也尝试使用eval(),但它给了我同样的问题(我知道 eval 并不理想)。理想情况下,我希望避免使用字典,因为这需要我先用值加载它,这似乎有一些不必要的步骤,但我现在对任何事情都持开放态度。
例子:
scraper(manufacturer='Honda') 会抓取模型的 JSON 文件,设置 model='Accord' 然后递归调用
scraper(manufacturer='Honda, model='Accord') 抓取一个年份文件,设置year=2014 并递归调用
scraper(manufacturer='Honda', model='Accord', year='2014') 这是基本情况
def scraper(self, manufacturers, model=None, year=None):
if year:
scrapeurl = '%s&manufacturer=%s&model=%s&year=%s' % (url, manufacturer, model, year)
return someFinalFunction()
elif model:
scrapeurl = '%s&manufacturer=%s&model=%s' % (url, manufacturer, model)
elif manufacturer:
scrapeurl = '%s&manufacturer=%s' % (url, manufacturer)
j = getJSONFromUrl(scrapeurl)
key, values = j.popitems()
for value in values:
locals()[key] = value
return self.scraper(manufacturer, model, year, color)
对于如何处理此问题的任何意见,我将不胜感激,我知道 Python 似乎总是有一些聪明的做事方式,而且我一直在学习更多关于它的知识,所以提前谢谢你!我也在这个例子中使用 Python3,如果这有什么改变的话
【问题讨论】:
-
根据docs for
locals- "注意 本词典的内容不应修改;更改可能不会影响由口译员。” -
locals()无论如何只是一本字典。只需制作自己的字典和所有值,而不是locals。 -
for value in values: ... return想要达到什么目的? -
Eric,JSON 会有多个值,所以在脚本执行 model='Accord' 之后,它会转到 model='Civic' 等
-
return不是“继续”的意思,而是“完成”的意思……
标签: python python-3.x recursion exec locals