2016-05-17 2 views
0

Как использовать переменную в качестве имени функции, чтобы я мог иметь список функций и инициализировать их в цикле. Я получаю ожидаемую ошибку, которая является объектом str. Но я не знаю, как это исправить. Благодарю.Как использовать переменную как имя функции в python

#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

Функции являются гражданами первого класса в 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 
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, и содержимое этого словаря может быть тривиально повторено.

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 

Используйте ту же логику, чтобы получить код работая как ожидалось

Смежные вопросы