使用变量调用导入的函数

时间:2018-12-19 16:13:47

标签: python python-3.x

我试图通过导入的函数文件调用带有变量的函数,但出现错误: AttributeError: 'module' object has no attribute 'i'

我有3个文件正在使用,list.txt functions.py和run.py

在我的run.py中,我打开list.txt并将其中的内容设置为列表并删除空白。然后我遍历列表,并尝试基于列表项调用函数。但是我认为代码不是将i作为函数,而是将str作为函数。我该如何将其转换为功能可以理解和运行的东西?

list.txt包含: foo bar

functions.py

class get_stuff:
    def foo(self):
        print('I just ran foo')
    def bar(self):
        print('I just ran bar')

run.py

import functions
with open(list.txt) as f: 
    xx = [xx.rstrip('\n') for xx in f]
for i in xx: 
    print ('working on item: ' + i )
    functions.get_stuff.i()

我是python的新手,很难找到解决问题的方法。我已经研究了几个小时,而当我找到合适的答案时,它们不覆盖导入的函数,而只是覆盖同一脚本中的函数。我可能以错误的方式看待它,也许我错过了一些超级简单的东西,或者这可能是python完全错误的方式!任何帮助都会很棒!

2 个答案:

答案 0 :(得分:0)

您的循环for i in xx:定义了i变量,然后调用functions.i()。变量i不可调用,因为它不是函数。

您可以使用my_function = getattr(<module_name>, <function_name>)来按字符串获取函数。然后,您可以像调用其他任何python函数一样调用my_function()

答案 1 :(得分:0)

在我读到这篇文章时,您实际上想运行一个以字符串形式给出的函数。可以使用getattr调用来完成。示例:

import functions

myfunc = 'foo'
f = getattr(functions, myfunc)
f()  # Prints 'I just ran foo'

如果愿意,您可以进一步简化它:

import functions

myfunc = 'foo'
getattr(functions, myfunc)()  # Prints 'I just ran foo'

将这些知识应用于您的示例中将产生:

import functions

with open(list.txt) as f: 
    xx = [xx.rstrip('\n') for xx in f]

for i in xx: 
    print ('working on item: ' + i )
    getattr(functions, i)()