2016-12-23 5 views
0

Я перехожу через каталог для отправки определенных интересующих файлов (содержащихся в списке) в соответствующие им функции, которые называются аналогично элементам в списке.Вызов функции с переменной

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 

получил Ошибка:

getattr(): attribute name must be string 

язык GetAttr была предпринята попытка на основе поисков здесь, и там было значительное обсуждение между использованием GetAttr, местные/глобалам, или Dict. Я даже попробовал hardcoding имя модуля, также безрезультатно. Любая помощь приветствуется.

+0

'GetAttr (объект, имя)', но вы вызываете его как GetAttr (имя, объекта), а также отметить, что даже не имеют переменную 'main' определена в коде – e4c5

+2

, что' main'? Я думаю, вы имеете в виду '' main'' вместо 'main' –

+0

Существует основная функция, содержащаяся в каждой импортируемой функции Contact_parser, Notes_parser, Records_parser –

ответ

0

getattr() функции принимают первый аргумент как действительный объект python (объект/модуль ... и т. Д.) И второй аргумент как строку.

В вашем случае замена

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) 
Смежные вопросы