2014-10-19 28 views
0

我有一個爲汽車刮取JSON文件的遞歸腳本。在每個遞歸級別上,它會得到一個新的變量,並將其與其他值一起傳遞給遞歸調用,每次都獲得越來越詳細的信息。我試圖用locals()來動態分配一個變量,但即使在調用之後它仍然是None(我記得有時候看到locals()是隻讀的)。使用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也一樣,如果改變任何東西

+3

每[docs for'locals'](https://docs.python.org/2/library/functions.html#locals) - *「**注意**本詞典的內容不應修改;更改可能不會影響inter使用的局部變量和自由變量的值preter。「* – jonrsharpe 2014-10-19 17:58:09

+1

'locals()'只是一本字典。只需製作自己的字典和所有值,而不是「本地人」。 – BrenBarn 2014-10-19 18:00:41

+0

什麼是價值的價值:...返回試圖實現? – Eric 2014-10-19 18:05:06

回答

1

這不是完全清楚你在做什麼試圖做,但也許這將有助於:

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' 
+0

FinalFunction沒有任何參數,因爲我清理了代碼,以使它更短,並且與問題出現的位置相關,感謝您花時間去了解。 – Parker 2014-10-19 18:13:22

+0

另外,不知道現代str.format的事情,很酷,謝謝 – Parker 2014-10-19 18:13:39

+1

@皮克在一般情況下,請小心,當切割代碼,以確保它保持可理解 - 我也困惑於'url'缺乏範圍! – jonrsharpe 2014-10-19 18:14:35

2

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) 
+0

'鑰匙'是一個錯字,我的壞。此外,爲什麼這會降低,誰能做到這一點,請解釋你爲什麼這樣做,爲什麼他的方法可能不理想? – Parker 2014-10-19 18:09:04

+0

@Parker:Downvoter似乎已經撤消了 – Eric 2014-10-19 20:41:36