2016-01-14 2 views
0

Можно ли использовать переменную как имя функции в python? Например:Как использовать переменную как имя функции в Python

list = [one, two, three] 
for item in list: 
    def item(): 
     some_stuff() 
+6

Почему вы хотите это сделать? Похоже, это действительно плохая идея. –

+1

Итак, вы хотите кучу функций, которые все делают то же самое? –

+3

Это явно проблема [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem), пожалуйста, покажите нам, ЧТО проблема, которую вы пытаетесь решить, а не КАК вы подумайте, что вы хотите его решить. –

ответ

1

Короткий ответ: нет. Когда вы объявляете переменную, вы привязываете имя к объекту. То же самое происходит, когда вы объявляете функцию. Вы можете попробовать его для себя в консоли питона и посмотреть, что происходит:

>name=1 
>name 
1 
>def name(x): print(x+1) 

>name 
function name at 0x000001CE8B8122F0 
+0

OP может назначать функцию переменной или, возможно, добавлять ее в список и заканчивать закрытием. Полезен ли это еще один вопрос! – tdelaney

2

Функция в Python являются объектами, которые имеют имя, ссылающиеся их, так что вы можете передать их вокруг, хранить в списках и словарях (общее пользование при создании таблиц перехода).

I.e. это работает:

def one(): 
     print "1" 

    def two(): 
     print "2" 

    def three(): 
     print "3" 

    l = [one, two, three] 

    for item in l: 
     item() 

Напечатает:

1 
2 
3 

Не используйте list в качестве имени переменной, потому что таким образом вы переопределить Buildin.

def - инструкция, которая также выполняется, в отличие от функций defenitions в скомпилированных языках. Поэтому, когда вы вызываете def item():, вы не определяете функцию для one, two, three, но переопределяете item имя.

В целом не совсем понятно, что вы пытаетесь сделать, но это не похоже на хорошую идею. Можете объяснить, что вы пытаетесь выполнить, или переосмыслить то, как вы хотите это сделать.

+1

Вопрос в следующем: «можно ли определить функции, основанные на списке имен?» не «можно ли выполнить список предопределенных функций?» –

0

Нет, это не возможно назвать строковый объект она выдаст ошибку

list = ['one', 'two', 'three'] for item in list: item() def item(): print list

Ошибка: «строка» объект не вызываемая

+0

Это потому, что вы объявляете их как строки –

2

Вы не можете определить функцию, используя переменную но вы можете восстановить функцию к имени переменной. Ниже приведен пример добавления их в глобальное пространство имен модуля.

one = 'one' 
two = 'two' 
three = 'three' 
l = [one, two, three] 
def some_stuff(): 
    print("i am sure some stuff") 
for item in l: 
    def _f(): 
     some_stuff() 
    globals()[item] = _f 
    del _f 

one() 
two() 
three() 
+0

Я считаю, что этого недостаточно, если 'some_stuff' имеет код, который зависит от элемента (я считаю, что это тот случай, который описывает OP, даже если это не очень хорошо сказано). –

+0

@ enrico.bacis Да, может быть, что OP имеет несколько функций 'some_stuff1()' и т. Д. ... и ищет назначение 'one = some_stuff1',' two = some_stuff2' и т. Д. ... Я пытался чтобы соответствовать примеру, предполагая, что он может определить реальный прецедент. – tdelaney

+0

да, проверьте мой ответ, чтобы понять, что я имел в виду;) Проблема в том, что так все функции «поддерживаются» одной и той же функцией '_f'. –

0

Что об этом:

funcs = ["one", "two", "three"] 
for item in funcs: 
    def bindedfunc(): 
     # function stuff there 
    exec("{} = bindedfunc".format(item)) 

one() 
two() 
three() 

быть сознательным, что one, two & three ссылаются только одну функцию (последнее определение).

PS: Пожалуйста, не делайте этого, это как не чувство.

1

Вы можете сделать это:

from types import FunctionType 
from copy import copy 

def copy_function(fn): 
    return FunctionType(copy(fn.func_code), copy(fn.func_globals), name=item, 
         argdefs=copy(fn.func_defaults), 
         closure=copy(fn.func_closure)) 

list = ['one', 'two', 'three'] 

for item in list: 
    def _fn(): 
     print(item) 
    globals()[item] = copy_function(_fn) 
list = map(eval, list) 
Смежные вопросы