2010-02-27 66 views

Trả lời

31

Tại sao không làm:

big(lite, (1, 2, 3)) 

?

Sau đó, bạn có thể làm:

def big(func, args): 
    func(*args) 
+5

bạn thậm chí có thể làm 'lớn (lite, 1, 2, 3)' và 'def lớn (func, * args): func (* args)' –

+1

Đó là tốt đẹp nếu bạn có thể (và muốn) thay đổi 'big', và' lite' có một chữ ký cố định. Nhưng đôi khi một hoặc cả hai là bên ngoài. Trong trường hợp đó, phương thức của Teddy ('partial') là tổng quát hơn nhiều. – Mark

5
import functools 

#main 
big(functools.partial(lite, 1,2,3)) 
0

Không Bằng cách này, bạn đang đi qua để lớn giá trị trả về của Lite function().

Bạn nên làm điều gì đó như:

def lite(a, b, c): 
    return a + b + c 

def big(func, arg): 
    print func(arg[0], arg[1], arg[2]) 



big(lite, (1, 2, 3)) 
+0

Đây là cách giải nén tuple dành cho - xem câu trả lời của tôi. – Skilldrick

3

vấn đề tương tự thường được khắc phục theo hai cách:

  1. Với lambda ... nhưng sau đó các chức năng thông qua sẽ mong đợi một đối số, quá lớn() nhu cầu được thay đổi
  2. Với các chức năng được đặt tên, hãy gọi các hàm ban đầu bằng các đối số. Xin lưu ý rằng hàm đó có thể được khai báo bên trong hàm khác và các đối số có thể là các biến.

Xem ví dụ:

#!/usr/bin/python 

def lite(a,b,c): 
    return "%r,%r,%r" % (a,b,c) 

def big(func): # func = callable() 
    print func() 

def big2(func): # func = callable with one argument 
    print func("anything") 


def main(): 
    param1 = 1 
    param2 = 2 
    param3 = 3 

    big2(lambda x: lite(param1, param2, param3)) 

    def lite_with_params(): 
     return lite(param1,param2,param3) 

    big(lite_with_params) 

main() 
Các vấn đề liên quan