通过循环函数名列表并使其成为变量,从模块中调用许多python函数



我在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))

最新更新