2010-08-14 12 views
2

나는 야후 날씨 정보를 가져 와서 Twitter에 게시하는 멋진 작은 응용 프로그램을 작성했습니다. 완벽하게 작동 했으므로 코드를 다른 이름의 파일로 다시 배열하여 더 이해하기 쉽도록했습니다. 그리고 그 때 제가 어떤 문제를 겪었습니다.인스턴스를 함수 인수로 전달

이전에 libtweather.pyClass이있었습니다. 내 account입니다. 그것은 내가 accountName.parseFeed()을 할 수있게 해 주었고 나는 야후의 파서드 결과물을 출력으로 받았다. 이 같은 Class의 인스턴스를 생성이 내 메인 스크립트에서 액세스 한

(__ini__은 날씨 URL, 트위터 사용자 이름과 인수로 암호를했다) : 그것은 모든 계정 이름의 목록을 유지 exec '%s = lw.twitterWeather("%s", "%s", "%s")' % (item[0], item[1], item[2], item[3])
다른 함수에 인수로 전달 된 목록. 인스턴스가 없기 때문에

def getWeather(accountList): #account names passed as a list of strings 
    for item in accountList: 
     print item, ': ', 
     item = eval(item)  
     print item.parseFeed(), '\n 

내가 Class과 같은 파일로 getWeather 기능을 이동하는 지금 결정했지만 라인 item = eval(item)의 나에게 문제를 제공합니다 :

또 다른 기능 getWeather 수행하여 날씨를 가지고 해당 파일에 생성됩니다. 그들 모두는 주요 스크립트에 있습니다.

이제 내 질문 : 그 인스턴스를 함수의 인수로 제공 할 수있는 방법이 있습니까? 또는 함수를 Class에 넣어야합니까? 비록 내가 그랬더라도, 나는 아직도 item = eval(item)을 필요로 할 것이므로, 목록에있는 여러 항목에 대해 item.parseFeed()을해야 할 필요가있다.

미리 감사드립니다. 내 애플 리케이션은 여기에 전체 게시물을 조금 있지만, 더 잘 이해할 필요가 있다면 더 많은 코드를 게시 할 것이다.

업데이트 :libtweather.py을 가져 와서 인스턴스를 만들었습니다. 그 안에있는 함수가 액세스 할 수 있도록 스크립트의 맨 아래에 코드를 생성하는 인스턴스가 추가되었습니다. 나는 더 나은 방법이있을 것이라고 확신하지만 현재 나에게 도움이된다.

+1

클래스의 인스턴스를 만들기 위해'exec'를 사용하게 된 특별한 이유가 있습니까? –

+0

아무 것도 없습니다. 그것이 내가 구글에서 만난 첫 번째 방법이었습니다. globals(), vars() 또는 locals() 중 하나를 사용할 수 있다는 것을 알고 있습니다. 나는 지금 내가 사용하려고하는 것을보기 위해 그들을보고있다. – avacariu

+0

'eval'이나'exec'을 사용해야 할 필요가있는 경우, 그렇게하지 마십시오. 대신 다른 것을하십시오. 절대 사용하지 마십시오. 물론 당신이 필요로하지 않는 한, 그들이 거기에있는 이유입니다. 그러나 당신이 그 사람들을 __need__한다는 것을 알기도 전에, 당신이 원하는 것을 할 수있는 다른 좋은 방법 __이 있음을 알아야합니다. 이것은 거의 사실이 아닙니다. – aaronasterling

답변

5

이러한 항목을 저장하려면 명시 적으로 사용해야합니다. eval, exec, globals, localsvars은이 작업을 제대로 수행하지 못하는 끔찍한 바보 같은 방법입니다. Python의 선 (Zen of Python)에서 "암묵적보다 뚜렷한 것이 좋습니다"를 기억하십시오.

feeds = {} 
for item in whatever: 
    feeds[item[0]] = lw.twitterWeather(*item[1:]) 

def getWeather(feeds, accountList): 
    for item in accountList: 
     print '%s: %s' % (item, feeds[item].parseFeed()) 
+0

+1 선은 참조한다 – Odomontois

+0

나는 결코 dict를 생각하지 않았다. 이 응용 프로그램은 내가 파이썬을 배우기 시작한 방법이었고, 최근에야 dicts의 놀라운 점을 깨닫기 시작했습니다. 그러나 클래스와 동일한 파일에'getWeather'가 정의되어 있고 클래스 파일과 별도로 주 스크립트에서 인스턴스를 생성하는 경우이 함수를 인수로 전달하고 인스턴스가 올바른 위치에 있는지 확인할 수 있습니까? (클래스 파일 내부에서 함수는'lw'가 반입되지 않기 때문에'lw.whatever'를 가질 수 없습니다.)'* item [1 :]'; 네가 할 수 있다는 것을 몰랐다. * 죄송합니다. 그러나 저는 여전히이 모든 것에 대해 새로운 것 같습니다. P * – avacariu

+0

그래서 나는 결국 이것을 바 꾸었습니다. 이전에 가지고 있던 것 대신에 dict을 사용하는 기능을 갖기 위해 많이 변하지 않았습니다. 초기 질문과 동일한 조직을 사용하지는 않지만 (주 스크립트에서는 내 libtweather.py 내부에 인스턴스를 생성하고 있습니다), libtweather 내부의 getWeather 함수로 시도해 보았습니다. py'를 내 주된 스크립트에서 삭제하면 효과가있었습니다. 인스턴스가 오류없이 승인되었습니다. 그래서 대답이 받아 들여졌습니다. 감사! – avacariu

관련 문제