使用变量调用函数

时间:2016-12-23 05:19:40

标签: python python-2.7 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

收到的错误是:

getattr(): attribute name must be string

基于此处的搜索尝试了getattr语言,并且在使用getattr,local / globals或dict之间进行了重要讨论。我甚至尝试过硬编码模块名称,也无济于事。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

getattr()函数将第一个参数作为有效的python实体(对象/模块......等),将第二个参数作为字符串。

在您的情况下替换

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

getattr(Contact_parse, 'main')

应该有用。

但是如果你的模块名称是字符串形式,可能你可以尝试,

getattr(sys.modules[t + "_parse"], 'main')

答案 1 :(得分:0)

这是我的工作方式,但我的所有功能都是类方法。

getattr(ClassName(), functionName)(fargs_in)