2010-02-27 33 views

Antwort

31

Warum nicht tun:

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

?

Dann können Sie tun:

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

Sie auch 'groß tun können (lite, 1, 2, 3)' und 'def groß (func, * args): func (* args)' –

+1

Das ist schön, wenn Sie 'big' ändern können (und wollen), und' lite' hat eine feste Signatur. Aber oft sind einer oder beide extern. In diesem Fall ist Teddys Methode ("partiell") viel allgemeiner. – Mark

5
import functools 

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

nicht auf diese Weise, vorbei sind Sie groß der Rückgabewert von lite() Funktion.

Sie sollten so etwas wie tun:

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

Dies ist, was Tupel-Entpacken ist - siehe meine Antwort. – Skilldrick

3

Ein ähnliches Problem in der Regel auf zwei Arten gelöst:

  1. Mit Lambda ... aber dann wird die übergebene Funktion ein Argument erwarten, so groß() Bedürfnisse geändert werden
  2. Mit benannten Funktionen Aufruf der ursprünglichen Funktionen mit Argumenten. Bitte beachten Sie, dass solche Funktionen innerhalb anderer Funktionen deklariert werden können und die Argumente Variablen sein können.

Siehe Beispiel:

#!/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() 
Verwandte Themen