2016-12-23 6 views
0

나는리스트에있는 항목들과 비슷한 이름의 특정 함수에 관심있는 특정 파일 (리스트에 포함 된)을 보내도록 디렉토리를 반복하고있다.변수가있는 함수 호출하기

getattr(): attribute name must be string 

getattr 언어는 시도 여기에 검색을 기반으로하였으며, getattr, 지역/전역, 또는 딕셔너리를 사용하여 사이에 상당한 토론이 있었다 : 오류를 수신

import os,sys,argparse 
import Contact_parse 
import Notes_parse 
import Records_parse 
... 
def file_distro(dir): 
''' 
This function distributes the source files to their relevant parser scripts 
''' 
file_types = ["Contact","Notes","Records"] 
for filename in os.listdir(dir): 
    for t in file_types: 
     if filename.startswith(t) and filename.endswith(".xml"): 
      print("%s: %s") % (t,filename) # Troubleshooting, works 

      try: 
       func = getattr("%s_parse" % (t),main) 
        # Returns TypeError: getattr(): attribute name must be string 
       #func = getattr(Contact_parse, main) 
        # Tried hardcoding to troubleshoot, 
        # also returns TypeError: getattr(): attribute name must be string 
       #print("%s_parse" % t) # Troubleshooting, works 
      except AttributeError: 
       print("function not found: %s_parse.main" % (t)) 
      else: 
       func() 
     else: 
      continue 

이다. 심지어는 모듈 이름을 하드 코딩 해 보았습니다. 어떤 도움이라도 대단히 감사합니다.

+0

'getattr (객체 이름)'하지만 당신은 getattr (이름, 객체)로 호출하고 또한 당신도 main' 무슨 일이'당신의 코드 – e4c5

+2

에 정의 '라는 변수가없는 점에 유의하고 있습니다 main'? 제 생각에 당신은'main' 대신에'main''123을 사용합니다. –

+0

가져온 함수에 각각 main 함수가 있습니다 Contact_parser, Notes_parser, Records_parser –

답변

0

getattr() 함수는 첫 번째 인수를 유효한 파이썬 엔터티 (개체/모듈 ... 등) 및 두 번째 인수를 문자열로 취합니다.

getattr("%s_parse" % (t),main) 

getattr(Contact_parse, 'main') 

작동합니다으로 교체 귀하의 경우에는

. 당신 모듈 이름이 경우와 같이 문자열 형태한다면, 아마 당신이 시도 할 수

,

이가, 나를 위해 작동하지만 내 모든 기능은 클래스 메소드가 어떻게
getattr(sys.modules[t + "_parse"], 'main') 
+0

Joshi, getattr (sys.modules [t + "_parse"], 'main')'완벽하게 작동합니다. @ sid-m 덕택에 메인이 문자열 값이 될 필요성을 지적했다. –

0

.

getattr(ClassName(), functionName)(fargs_in)