Как динамически определять функции?
У меня есть такие функции:
def activate_field_1():
print 1
def activate_field_2():
print 2
def activate_field_3():
print 3
Как определить activate_field_[x]
для x=1:10
, не печатая каждый из них? Я бы предпочел передать параметр, конечно, но для моих целей это невозможно.
Ответы
Ответ 1
Вы хотите определить их отдельно в своем исходном файле, статически? Тогда ваш лучший вариант - написать script, чтобы сгенерировать их.
Если, с другой стороны, вам нужны эти функции во время выполнения, вы можете использовать функцию более высокого порядка. Напр.
>>> def make_func(value_to_print):
... def _function():
... print value_to_print
... return _function
...
>>> f1 = make_func(1)
>>> f1()
1
>>> f2 = make_func(2)
>>> f2()
2
Вы можете создать список из них и сохранить его снова во время выполнения.
>>> my_functions = [make_func(i) for i in range(1, 11)]
>>> for each in my_functions:
... each()
...
1
2
3
...
Ответ 2
Вот что-то, что производит имена функций точно так, как вы хотели (и немного проще, чем создание динамического метода/метода выполненияпринятый ответ, упомянутый в @Goutham теперь удаленный ответ):
FUNC_TEMPLATE = """def activate_field_{0}(): print({0})"""
for x in range(1, 11): exec(FUNC_TEMPLATE.format(x))
>>> activate_field_1()
1
>>> activate_field_7()
7
В версиях Python 3. 6+ его можно записать, как показано ниже, с использованием так называемых f-string литералов:
for x in range(1, 11): exec(f"""def activate_field_{x}(): print({x})""")
Ответ 3
Вы можете поместить новые символы в словарь текущих привязок переменных, возвращаемых vars()
:
for i in range(1, 11):
def f(x):
def g():
print x
return g
vars()['activate_field_%d' % i] = f(i)
>>> activate_field_3()
3
Но этот трюк, как правило, не рекомментируется, если вы точно не уверены, что он вам нужен.
Ответ 4
Возможно, вы можете адаптировать этот рецепт для своих нужд.
from functools import partial
class FunctionPool:
def __init__(self,function):
self.function = function
def __getitem__(self,item):
return partial(self.function,item)
>>> @FunctionPool
def func(item,param):
print "function#{item} called with {param}".format(
item = item,
param = param )
>>> f = func[2]
>>> f(3)
function#2 called with 3