2012-01-17 23 views
8

Por favor, considere función simple:Función con argumentos predefinidos dependientes

def fun(x, y, param1=10, param2=param1/3): 
    do something 

Dónde param1 y param2 no deberían estar obligados, pero se puede configurar por el usuario. Si param2 no está configurado, el valor depende de param1 de alguna manera.

El ejemplo de arriba elevará NameError: name 'param1' is not defined

¿Hay una manera de hacer este tipo de misiones en Python?

Respuesta

12

Una forma es emular este dentro de la función:

def fun(x, y, param1=10, param2=None): 
    if param2 is None: 
     param2 = param1/3 
    # do something 

Si param2=None es una entrada válida en fun(), el siguiente podría ser una mejor alternativa:

default = object() 

def fun(x, y, param1=10, param2=default): 
    if param2 is default: 
     param2 = param1/3 
    # do something 

(Después de haber estado mirando este segundo ejemplo por unos minutos, realmente me gusta la sintaxis is default.)

La razón por la que orig La versión inal no funciona es que los valores predeterminados se computan y se enlazan en el tiempo de definición de la función. Esto significa que no puede tener un valor predeterminado que depende de algo que no se conoce hasta que se llame a la función (en su caso, el valor de param1).

+2

'default' podría ser engañoso,' not_set' podría ser un nombre mejor. No está claro (para mí) a simple vista que 'predeterminado' no sea el valor predeterminado en sí, sino un marcador de posición que indique que se debe usar un valor predeterminado para' param2'. – jfs

Cuestiones relacionadas