如何将变量用作函数名,以便我可以拥有一个函数列表并在循环中初始化它们。我收到了我预期的错误,即str对象不可调用。但我不知道如何解决它。感谢。
#Open protocol configuration file
config = configparser.ConfigParser()
config.read("protocol.config")
# Create new threads for each protocol that is configured
protocols = ["ISO", "CMT", "ASCII"]
threads = []
threadID = 0
for protocol in protocols:
if (config.getboolean(protocol, "configured") == True):
threadID = threadID + 1
function_name = config.get(protocol, "protocol_func")
threads.append(function_name(threadID, config.get(protocol, "port")))
# Start new threads
for thread in threads:
thread.start()
print ("Exiting Main Protocol Manager Thread")
答案 0 :(得分:1)
如果您将一组有效的protocol_func
放在特定模块中,则可以使用getattr()
从该模块中检索:
import protocol_funcs
protocol_func = getattr(protocol_funcs, function_name)
threads.append(protocol_func(threadID, config.get(protocol, "port")))
另一种方法是装饰器来注册选项:
protocol_funcs = {}
def protocol_func(f):
protocol_funcs[f.__name__] = f
return f
...此后:
@protocol_func
def some_protocol_func(id, port):
pass # TODO: provide a protocol function here
这样只能在配置文件中使用用@protocol_func
修饰的函数,并且可以轻易地迭代该字典的内容。
答案 1 :(得分:1)
函数是python中的一等公民,因此您可以将它们视为普通变量,只需构建一个包含迭代函数的列表:
>>> for f in [int, str, float]:
... for e in [10, "10", 10.0]:
... print(f(e))
...
10
10
10
10
10
10.0
10.0
10.0
10.0
答案 2 :(得分:0)
可以将函数放入列表中以便稍后调用:
def a():
print("a")
def b():
print("b")
def c():
print("c")
func = [a, b, c]
for function in func:
function()
您获得的输出来自所有功能:
a
b
c
使用相同的逻辑来使代码按预期工作