用locals()动态赋值变量在递归函数中不起作用

2024-04-25 07:39:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个递归脚本,它为汽车创建了一个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,如果这改变了什么的话


Tags: 文件nonejsonurlmodeleval情况scraper
2条回答

现在还不完全清楚你想做什么,但也许这会有所帮助:

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'

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)

相关问题 更多 >