2010-09-10 40 views
13

tôi có chức năng như thế này:Python xác định chức năng động

def activate_field_1(): 
    print 1 

def activate_field_2(): 
    print 2 

def activate_field_3(): 
    print 3 

Làm thế nào để xác định activate_field_[x] cho x=1:10, mà không cần gõ ra mỗi một trong số họ? Tôi muốn vượt qua một tham số, tất nhiên, nhưng với mục đích của tôi, điều này là không thể.

Cảm ơn!

+0

Bạn nói trong một nhận xét rằng bạn muốn định nghĩa chúng tĩnh nhưng sau đó bạn đề cập rằng làm như vậy sẽ lãng phí không gian trong tệp nguồn. Đó là nó? – aaronasterling

+0

"Chức năng động" là gì? Bạn có thể giải thích ý nghĩa của cụm từ này không? –

+0

Câu hỏi này có vẻ là một bản sao: http://stackoverflow.com/questions/11291242/python-dynamically-create-function-at-runtime –

Trả lời

17

Bạn có muốn xác định các tệp này riêng lẻ trong tệp nguồn của mình không? Sau đó, lựa chọn tốt nhất của bạn là viết kịch bản để tạo chúng.

Nếu mặt khác, bạn muốn các hàm này trong thời gian chạy, bạn có thể sử dụng hàm bậc cao hơn. Ví dụ:

>>> 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 

Bạn có thể tạo danh sách các lưu trữ này và lưu trữ, một lần nữa khi chạy.

>>> my_functions = [make_func(i) for i in range(1, 11)] 
>>> for each in my_functions: 
...  each() 
... 
1 
2 
3 
... 
+0

Vâng, tôi muốn xác định chúng tĩnh trong tệp nguồn. Tôi có thể viết kịch bản cho họ, mặc dù rất nhiều chức năng lãng phí không gian. Cảm ơn bạn đã giải thích về cách thực hiện nó trong thời gian chạy. – ash

3

Bạn có thể đặt các biểu tượng mới vào từ điển của bindings biến hiện nay được trả về bởi 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 

Nhưng thủ thuật này thường không được recommented trừ khi bạn chắc chắn chắn rằng bạn cần nó.

3

Có thể bạn có thể điều chỉnh công thức này theo nhu cầu của mình.

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

Dưới đây là một cái gì đó tạo ra tên hàm chính xác như bạn muốn (và là một chút đơn giản hơn Dynamic/runtime method creation 's accepted answer nêu tại @ Goutham là bây giờ đã xóa câu trả lời):

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

Chính xác những gì tôi cần để tự động tạo các hàm trường hợp thử nghiệm để kiểm tra đơn vị, cảm ơn. – tilper

Các vấn đề liên quan