Можно ли использовать переменную как имя функции в python? Например:Как использовать переменную как имя функции в Python
list = [one, two, three]
for item in list:
def item():
some_stuff()
Можно ли использовать переменную как имя функции в python? Например:Как использовать переменную как имя функции в Python
list = [one, two, three]
for item in list:
def item():
some_stuff()
Короткий ответ: нет. Когда вы объявляете переменную, вы привязываете имя к объекту. То же самое происходит, когда вы объявляете функцию. Вы можете попробовать его для себя в консоли питона и посмотреть, что происходит:
>name=1
>name
1
>def name(x): print(x+1)
>name
function name at 0x000001CE8B8122F0
OP может назначать функцию переменной или, возможно, добавлять ее в список и заканчивать закрытием. Полезен ли это еще один вопрос! – tdelaney
Функция в 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
имя.
В целом не совсем понятно, что вы пытаетесь сделать, но это не похоже на хорошую идею. Можете объяснить, что вы пытаетесь выполнить, или переосмыслить то, как вы хотите это сделать.
Вопрос в следующем: «можно ли определить функции, основанные на списке имен?» не «можно ли выполнить список предопределенных функций?» –
Нет, это не возможно назвать строковый объект она выдаст ошибку
list = ['one', 'two', 'three'] for item in list: item() def item(): print list
Ошибка: «строка» объект не вызываемая
Это потому, что вы объявляете их как строки –
Вы не можете определить функцию, используя переменную но вы можете восстановить функцию к имени переменной. Ниже приведен пример добавления их в глобальное пространство имен модуля.
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()
Я считаю, что этого недостаточно, если 'some_stuff' имеет код, который зависит от элемента (я считаю, что это тот случай, который описывает OP, даже если это не очень хорошо сказано). –
@ enrico.bacis Да, может быть, что OP имеет несколько функций 'some_stuff1()' и т. Д. ... и ищет назначение 'one = some_stuff1',' two = some_stuff2' и т. Д. ... Я пытался чтобы соответствовать примеру, предполагая, что он может определить реальный прецедент. – tdelaney
да, проверьте мой ответ, чтобы понять, что я имел в виду;) Проблема в том, что так все функции «поддерживаются» одной и той же функцией '_f'. –
Что об этом:
funcs = ["one", "two", "three"]
for item in funcs:
def bindedfunc():
# function stuff there
exec("{} = bindedfunc".format(item))
one()
two()
three()
быть сознательным, что one
, two
& three
ссылаются только одну функцию (последнее определение).
PS: Пожалуйста, не делайте этого, это как не чувство.
Вы можете сделать это:
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)
Почему вы хотите это сделать? Похоже, это действительно плохая идея. –
Итак, вы хотите кучу функций, которые все делают то же самое? –
Это явно проблема [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem), пожалуйста, покажите нам, ЧТО проблема, которую вы пытаетесь решить, а не КАК вы подумайте, что вы хотите его решить. –