2010-12-13 4 views
5
def test(): 
    print 'test' 

def test2(): 
    print 'test2' 

test = {'test':'blabla','test2':'blabla2'} 
for key, val in test.items(): 
    key() # Here i want to call the function with the key name, how can i do so? 
+0

Ой год .. я вижу ,, :), просто быстрый тестовый код;) – pkdkk

+1

Возможный дубликат [Вызов функции модуля из строки с именем функции в Python] (http://stackoverflow.com/ Вопросы/3061/call-a-function-of-a-module-from-a-string-with-the-functions-name-in-python) – cfi

ответ

16

Вы можете использовать сами объекты-функции как ключи, а не имена функций. Функции являются объектами первого класса в Python, поэтому их более чистое и элегантное использование напрямую, а не их имена.

test = {test:'blabla', test2:'blabla2'} 

for key, val in test.items(): 
    key() 
+1

Ты избил меня. – delnan

+0

Я импортирую такой диктофон как: test = {'test': 'blabla', 'test2': 'blabla2'} в это время функции не создаются. – pkdkk

1

У Иоанна есть хорошее решение. Вот еще один способ, с помощью eval():

def test(): 
     print 'test' 

def test2(): 
     print 'test2' 

mydict = {'test':'blabla','test2':'blabla2'} 
for key, val in mydict.items(): 
     eval(key+'()') 

Обратите внимание, что я изменил название словаря, чтобы предотвратить столкновение с именем функции test().

+0

Oof, не уверен, почему вы когда-либо использовали это метод «объекты функции как сами ключи». Во всяком случае, вы можете быть интроспективным, используя что-то вроде 'hasattr', но никогда не' eval' –

+0

@ Daniel Я не сказал, что это было красиво! : D – chrisaycock

+0

Это работает, но 'eval()' имеет много накладных расходов, чтобы использовать его для вызова функции. Есть и другие, более дорогие способы «Pythonic» ... – martineau

5

Если то, что вы хотите знать, «Как вызвать функцию, когда у вас есть это имя в строку», вот некоторые хорошие ответы - Calling a function of a module from a string with the function's name in Python

+1

+1 для исследования того, ответил ли этот вопрос здесь (что-то должно было сделать ОП, ИМХО). – martineau

0

Защиту тест(): печать «тест»

защиту test2(): печати 'test2'

assign_list = [тест, test2]

для я в assign_list: I()

+0

в test_list test, test2 дать прямому пути i.e [test, test2] – Surya

+0

не похоже на это ["test", test2] – Surya

+0

для i в assign_list: эта следующая строка i() – Surya

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