2010-09-10 73 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 2010-09-11 02:58:36

+0

什麼是「動態功能」?你能解釋這句話的意思嗎? – 2013-05-14 21:37:10

+0

這個問題似乎是重複的:http://stackoverflow.com/questions/11291242/python-dynamically-create-function-at-runtime – 2013-05-14 21:40:25

回答

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 2010-09-10 19:36:05

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

這裏的東西產生的函數名正是像你想(和比@ Goutham提到Dynamic/runtime method creationaccepted answer現在刪除回答簡單一些):

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 2017-05-25 03:33:36