我在tld_list.py中有三个类似的函数。我正在处理mainBase.py文件。
我试图创建一个变量字符串,通过循环所有函数的列表来调用适当的函数。我的代码从函数名列表中读取,在列表中迭代,并在每次迭代中运行函数。每个功能从不同的网站返回10条信息
我已经尝试了下面注释为选项A和选项B的两种变体
# This is mainBase.py
import tld_list # I use this in conjunction with Option A
from tld_list import * # I use this with Option B
functionList = ["functionA", "functionB", "functionC"]
tldIterator = 0
while tldIterator < len(functionList):
# This will determine which function is called first
# In the first case, the function is functionA
currentFunction = str(functionList[tldIterator])
选项A
currentFunction = "tld_list." + currentFunction
websiteName = currentFunction(x, y)
print(websiteName[1]
print(websiteName[2]
...
print(websiteName[10]
选项B
websiteName = currentFunction(x, y)
print(websiteName[1]
print(websiteName[2]
...
print(websiteName[10]
即使没有看到,我仍然通过用tldIterator += 1
结束每个循环来继续循环迭代
两个选项失败的原因相同,说明TypeError: 'str' object is not callable
我想知道我做错了什么,或者是否可以用变量调用循环中的函数
您有函数名称,但您真正想要的是绑定到tld_list
中这些名称的函数对象。由于函数名称是模块的属性,因此getattr
可以完成这项工作。此外,似乎列表迭代而不是跟踪自己的tldIterator
索引就足够了。
import tld_list
function_names = ["functionA", "functionB", "functionC"]
functions = [getattr(tld_list, name) for name in function_names]
for fctn in functions:
website_name = fctn(x,y)
您可以创建一个字典来提供名称到函数的转换:
def funcA(...): pass
def funcB(...): pass
def funcC(...): pass
func_find = {"Huey": funcA, "Dewey": funcB, "Louie": FuncC}
然后你可以打电话给他们,例如
result = func_find["Huey"](...)
您应该避免使用这种类型的代码。请尝试使用if或引用。但你可以试试:
websiteName = exec('{}(x, y)'.format(currentFunction))