我有這樣的功能: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
,無需打字了他們中的每一個?當然,我寧願傳遞一個參數,但爲了我的目的,這是不可能的。
謝謝!
我有這樣的功能: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
,無需打字了他們中的每一個?當然,我寧願傳遞一個參數,但爲了我的目的,這是不可能的。
謝謝!
你想在源文件中靜態定義這些單獨的文件嗎?那麼你最好的選擇是編寫一個腳本來生成它們。
另一方面,如果您希望在運行時使用這些函數,則可以使用更高階的函數。對於例如
>>> 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
...
是的,我想在源文件中靜態定義它們。我可以編寫腳本,儘管這麼多功能浪費空間。感謝有關如何在運行時執行此操作的解釋。 – ash 2010-09-10 19:36:05
你可以將新的符號到當前綁定變量由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除非你絕對確定你需要它。
也許你可以根據你的需要調整這個配方。
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
這裏的東西產生的函數名正是像你想(和比@ Goutham提到Dynamic/runtime method creation的accepted 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
正是我需要爲單元測試動態生成測試用例函數,謝謝。 – tilper 2017-05-25 03:33:36
你說的評論你想靜態定義它們,但是你提到這樣做會浪費源文件中的空間。這是什麼? – aaronasterling 2010-09-11 02:58:36
什麼是「動態功能」?你能解釋這句話的意思嗎? – 2013-05-14 21:37:10
這個問題似乎是重複的:http://stackoverflow.com/questions/11291242/python-dynamically-create-function-at-runtime – 2013-05-14 21:40:25