2010-09-10 5 views
13

У меня есть такие функции, как это:Python определить динамические функции

def activate_field_1(): 
    print 1 

def activate_field_2(): 
    print 2 

def activate_field_3(): 
    print 3 

Как определить activate_field_[x] для x=1:10, не печатая каждую из них? Конечно, я бы скорее передал параметр, но для моих целей это невозможно.

Спасибо!

+0

Вы говорите, что в комментировать, что вы хотите определить их статически, но затем вы упоминаете, что это приведет к ненужному пространству в исходном файле. Что он? – aaronasterling

+0

Что такое «динамическая функция»? Можете ли вы объяснить предполагаемое значение этой фразы? –

+0

Этот вопрос представляется дубликатом: http://stackoverflow.com/questions/11291242/python-dynamically-create-function-at-runtime –

ответ

17

Вы хотите определить их индивидуально в своем исходном файле, статически? Тогда ваш лучший вариант - написать скрипт для их создания.

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

>>> 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 
... 
+0

Да, я хотел бы определить их статически в исходном файле. Я могу их списать, хотя многие функции теряют пространство. Спасибо за объяснение того, как это сделать во время выполнения. – ash

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 

Но этот трюк, как правило, не recommented, если вы точно уверены, что вам это нужно.

3

Возможно, вы можете адаптировать этот рецепт для своих нужд.

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 
7

Вот то, что производит имена функций точно как вы хотели (и немного проще, чем Dynamic/runtime method creation «s accepted answer упоминается в @ Goutham теперь удален ответ):

func_template = """def activate_field_%d(): print(%d)""" 
for x in range(1, 11): exec(func_template % (x, x)) 

>>> activate_field_1() 
1 
>>> activate_field_7() 
7 
+0

Точно, что мне нужно для динамического генерации тестовых функций для модульного тестирования, спасибо. – tilper

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