2012-01-11 10 views
7

Este es mi código:paso de vacío/función noop/lambda como argumento por defecto

def execute(f, *args): 
    f(args) 

veces quiero pasar ninguna función f a execute, así que quiero f por defecto a la función de vacío.

+1

¿Qué error? ¿Y por qué su parámetro se llama 'function', pero llama' f'? –

+3

Probablemente haya recibido el mensaje de error 'nombre global 'f' no está definido' porque, bueno,' f' no está definido. Si recibió un mensaje de error diferente, especifique cuál (rastreo completo, por favor). –

Respuesta

6

No entiendo muy bien lo que está tratando de hacer
¿Pero algo como esto funcionaría para usted?

def execute(func=None, *args, **kwargs): 
    if func: 
     func(*args, **kwargs) 

También puede agregar una instrucción else para hacer lo que quiera.

+1

Sí, eso funciona. Estaba tratando de deshacerme de esta declaración 'if'. – Randomblue

+0

en esto si func is def func(): pase. No necesitas el if. just func (* args, ** kwargs) –

10

El problema es que a veces no quiero pasar ningún argumento para ejecutar, por lo que quiero que la función se configure de forma predeterminada en la función vacía.

funciona bien para mí:

>>> def execute(function = lambda x: x, *args): 
... print function, args 
... function(args) 
... 
>>> execute() 
<function <lambda> at 0x01DD1A30>() 
>>> 

yo en cuenta que su ejemplo se intenta utilizar f dentro de la aplicación, mientras que usted ha llamado el parámetro function. Podría realmente ser tan simple? ;)

Dicho esto, es necesario comprender que Python no tendrá forma de saber que desea omitir el argumento en default a menos que no hay argumentos en absoluto, por lo execute(0) no puede funcionar ya que los intentos para tratar 0 como una función .

+0

Lo siento, la pregunta fue terriblemente redactada. Lo he reescrito. – Randomblue

+6

Para hacerlo aún más genérico, hazlo 'lambda * x, ** xx: None'. Ahora es efectivamente una función no operativa universal: acepta cualquier número de argumentos y argumentos de palabra clave. –

6

una función anónima regresar Ninguno es a menudo una adecuada no-op:

mensaje
def execute(func=lambda *a, **k: None, *args, **kwargs): 
    return func(*args, **kwargs) 
+0

Supongo que esto significa que no hay ninguna notación más corta para 'lambda * a, ** k: None'. Probé 'func = pass', pero por supuesto que no funcionó. – kasperd

Cuestiones relacionadas