2014-10-19 2 views
0

자동차 용 JSON 파일을 스크랩하는 재귀 스크립트가 있습니다. 각 재귀 레벨에서 새로운 변수가 추가되고, 다른 값과 함께 재귀 호출에 전달되며 매번 더 자세히 정보가 전달됩니다. locals()을 사용하여 변수를 동적으로 할당하려고 시도했지만 호출 후에도 None으로 남아 있습니다 (때때로 locals()은 읽기 전용입니다).지역 변수를 동적으로 할당하는 변수가 재귀 함수에서 작동하지 않습니다.

나는 또한 eval()을 사용해 보았는데, 그것은 나에게 똑같은 문제를 준다. (나는 eval이 이상하지 않다는 것을 안다.) 사전을 사용하는 것을 피하는 것이 이상적입니다. 왜냐하면 사전에 값을로드해야하기 때문에 먼저 불필요한 단계가있는 것처럼 보입니다. 그러나이 시점에서는 아무 것도 열지 않습니다.

예 :

scraper(manufacturer='Honda')이 모델의 JSON 파일을 긁어 것은 model='Accord'를 설정 한 다음 재귀의 year=2014을 설정 년의 파일을 긁힌 자국

scraper(manufacturer='Honda, model='Accord')를 호출하고 반복적 인

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) 

이 문제를 처리하는 방법에 대한 의견을 보내 주시면 고맙겠습니다. 파이썬이 항상 일을하는 영리한 방법을 가지고있는 것 같아요. 그리고 항상 그것에 대해 더 많이 배우기 때문에 미리 감사드립니다! 그 아무것도

을 변경하면 내가
+3

: 위치 및 키워드 인수를 혼합,

instance.scraper(manufacturer='...') 

아니라 문자열 형식의 단지

instance.scraper('...') 

예보다 : 유일한 차이점은 지금 호출 할 필요가 있다는 것입니다 [docs for'locals'] (https://docs.python.org/2/library/functions.html#locals) - * "** 참고 **이 사전의 내용은 수정해서는 안되며, 변경 사항은 영향을 미치지 않을 수도 있습니다 그 사이에 사용 된 지역 변수와 자유 변수의 값 preter. "* – jonrsharpe

+1

'locals()'는 어쨌든 사전 일뿐입니다. 'locals' 대신에 당신 만의 사전과 모든 값을 만들어주세요. – BrenBarn

+0

'값을위한 것 : ... return'이 성취하려고합니까? – Eric

답변

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 문자열 형식을 사용하여 원하는 인수를 동적으로 처리합니다. 사용자 단위

>>> '{0}&manufacturer={manufacturer}'.format('foo', **{'manufacturer': 'bar'}) 
'foo&manufacturer=bar' 
+0

finalFunction은 더 짧고 관련성이 높은 코드를 정리했기 때문에 인수를 취하지 않습니다. 문제가 발생했을 때 시간을내어 주셔서 감사합니다. – Parker

+0

또한 현대의 str.format에 대해서는 잘 모릅니다. 감사합니다. – Parker

+1

일반적으로 @Parker는 이해하기 쉽도록 코드를자를 때주의하십시오. 또한 'url'이 없으면 혼란스러워합니다. 범위! – jonrsharpe

2

locals()['key'] = value 아직 locals()[key] = value


더 나은해야한다, 너무 예에서 Python3을 사용하고, **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

+0

@Parker : Downvoter가 취소 한 것처럼 보입니다 – Eric

관련 문제