[英]Dynamically assigning variable with locals() isn't working in recursive function
我有一个递归脚本,该脚本正在为汽车抓取JSON文件。 在每个递归级别,它都会添加一个新变量,并将其(以及其他值)传递给递归调用,每次获取的信息越来越详细。 我尝试使用locals()
动态分配变量,但是即使在调用后它也保持None
(我记得看到的是locals()
有时是只读的)。
我也尝试使用eval()
,它给了我同样的问题(我知道eval并不理想)。 理想情况下,我希望避免使用字典,因为这将要求我先用值加载它,这似乎有一些不必要的步骤,但是目前我可以接受任何东西。
例:
scraper(manufacturer='Honda')
将抓取模型的JSON文件,设置model='Accord'
,然后递归调用
scraper(manufacturer='Honda, model='Accord')
刮取年份的文件,set的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,如果这改变了一切
locals()['key'] = value
应为locals()[key] = value
更好的是,使用**kwargs
:
def scraper(self, manufacturer, model=None, year=None):
kwargs = dict(manufacturer=manufacturer, model=model, year=year)
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:
kwargs[key] = value
return self.scraper(**kwargs)
尚不清楚您要做什么,但这也许会有所帮助:
def scraper(self, **kwargs):
if kwargs.get('year') is not None:
scrapeurl = '{0}&manufacturer={manufacturer}&model={model}&year={year}'
return someFinalFunction() # not sure why this takes no arguments
elif kwargs.get('model') is not None:
scrapeurl = '{0}&manufacturer={manufacturer}&model={model}'
elif kwargs.get('manufacturer') is not None:
scrapeurl = '{0}&manufacturer={manufacturer}'
else:
raise KeyError
j = getJSONFromUrl(scrapeurl.format(url, **kwargs))
key, values = j.popitems()
for value in values:
kwargs[key] = value
return self.scraper(**kwargs)
它使用Python的内置功能将任意关键字参数作为字典,以及更现代的str.format
字符串格式,以动态处理您要查找的参数。 唯一的区别是您现在需要调用它:
instance.scraper(manufacturer='...')
而不只是
instance.scraper('...')
字符串格式的示例,混合了位置参数和关键字参数:
>>> '{0}&manufacturer={manufacturer}'.format('foo', **{'manufacturer': 'bar'})
'foo&manufacturer=bar'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.