我试图通过导入的函数文件调用带有变量的函数,但出现错误:
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完全错误的方式!任何帮助都会很棒!
答案 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)()