Как динамически определять функции?

У меня есть такие функции:

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