2010-05-24 5 views
5

me di cuenta de un problema cuando yo estaba tratando de usar del lambda en una fina a una lista de temas a los que dirigen simplemente:Python del() built-in no se puede utilizar en la asignación?

map(lambda x: del(x) if not x.isAlive() else x, self.threads) 

Ignorar por un segundo que esto no hace nada, estoy solo jugando con map, reduce y lambda.

Esto falla con un error de sintaxis en del (x). Con algunos problemas, creo que el problema es que del() no devuelve un valor. Por ejemplo, esta falla con el mismo error:

b = 5 
x = del(b) 

Esto no significa, sin embargo:

def rmThis(x): del(x) 

Lo que significa que estoy usando esta solución:

map(lambda x: rmThis(x) if not x.isAlive() else x, self.threads) 

Así es el limitación simplemente porque del() no devuelve un valor? Por qué no?

estoy usando Python 2.6.2

+0

¿Es necesario llamar 'del' en los objetos de subprocesos explícitamente? Si puede dejarlo en el contador de referencia o en el recolector de basura, puede escribir tihs en su lugar: '[hilo para hilo en self.threads if hilo.isAlive()]'. –

+3

Incluso si esto funcionó, no funcionaría :) No puede eliminar elementos de un iterable mientras está iterando sobre él. –

Respuesta

9

Dos problemas. El primero es más sutil así que lo explicaré primero.

El problema es que del elimina un enlace variable. Pasarle un valor no servirá para tu propósito.

Aquí es una ilustración

>>> a = 5 
>>> del(a) 
>>> a 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'a' is not defined 
>>> def mydel(x): del(x) 
... 
>>> a = 5 
>>> mydel(a) 
>>> a 
5 
>>> 

Como se puede ver. En el primer caso, la variable a se ha eliminado del espacio de nombre actual. No hay forma de referirse al objeto al que apuntaba (suponiendo que nada más apunta a lo mismo).

En el segundo caso, no está eliminando a del espacio de nombres. Está eliminando el enlace de x en el espacio de nombres de la función cuyo efecto es que no podrá usar x como un valor r en la función (es decir, es una variable indefinida).

El segundo problema es el SyntaxError que es más simple. Las funciones de Python lambda solo pueden tener expresiones en ellas y no enunciados. del en no una expresión (es decir, no una llamada de función) - es una declaración (del_stmt) y por lo tanto no puede aparecer en el cuerpo de la lambda. Vería el mismo problema si intentara poner un print en el cuerpo de la lambda.

>>> lambda x: print x 
    File "<stdin>", line 1 
    lambda x: print x 
       ^
SyntaxError: invalid syntax 

Esto también explica por qué el x=del(a) falla. La sintaxis de la declaración no es válida. No es una función que pueda llamarse.

9

La limitación es que del is a statement y no una expresión . No "devuelve un valor" porque las declaraciones no devuelven valores en Python.

La forma lambda sólo permite mencionar las expresiones (porque hay una implícita return antes de la expresión), mientras que la forma def permite una sola función comunicado que se especificará en una línea (como lo han hecho con rmThis).

Normalmente del se utiliza sin paréntesis, como:

del x 

Sin embargo, incluso paréntesis alrededor del argumento como se permite del(x) pero no quiere decir que es una llamada a la función.

+1

Ese enlace es lo que necesitaba, gracias. – emcee

+0

+1 para el enlace. –

Cuestiones relacionadas