¿Es posible algo como lvalue of perl o setf of lisp en python?

En lisp puedes decir:

(setf (aref a 1) 5) 

En Perl se puede decir:

 substr( $string, $start, $stop ) =~ s/a/b/g 

¿Es posible algo como esto en python? Quiero decir, ¿es posible usar el resultado de la función como un lvalor (como objective para la operación de asignación)?

No. La asignación al resultado de una llamada de función está específicamente prohibida en el nivel del comstackdor:

 >>> foo() = 3 File "", line 1 SyntaxError: can't assign to function call 

Sin embargo, hay dos casos especiales en la syntax de Python:

 # Slice assignment a = [1,2,3,4] a[0:2] = 98, 99 # (a will become [98, 99, 3, 4]) # Tuple assignment (x, y, z) = (10, 20, 30) 

Tenga en cuenta también que en Python hay una dualidad de statement / función y una asignación o una asignación aumentada ( += , *= …) no es solo un operador normal, sino una statement y tiene reglas especiales.

Además, en Python no hay un concepto general de “puntero” … la única manera de pasar a una función un lugar donde almacenar algo es pasar un cierre de “establecedor” porque para encontrar un lugar asignable necesita usar nombres explícitos, indexar o necesita trabajar con el diccionario de instancia si el lugar es un miembro de instancia de objeto).

 # Pass the function foo where to store the result foo( lambda value : setattr(myObject, "member", value) ) 

No, no hay manera de hacer esto en general. La notación de corte se cierra en un caso limitado, ya que puede hacer cosas como esta:

 >>> a = [1, 2, 3] >>> a[1:2] = [5, 6] >>> a [1, 5, 6, 3] 

En resumen, no.

Sin embargo, si define __setitem__ , puede asignar un subíndice, por ejemplo

 foo['subscript'] = 7 

Y podrías devolver foo (y también el subíndice, si quisieras) desde una función.

 container, subscript = whatevs() container[subscript] = 7 

o, en una línea:

 operator.setitem(*(whatevs()+(7,))) 

Ver operator .

En general, no (no dejes de leer !!!!). Observe lo siguiente:

 class test: test = 4 test().test = 5 # we can no longer refer to the created object. x = test().test = 6 x # 6 

Sin embargo, al hacer una búsqueda encontré esto (que parece una mala práctica, pero utilizable):

 globals()["varname"] = 5 varname # 5 

Entonces, mezclando tu Perl con mi Python obtenemos:

 globals()[substr( $string, $start, $stop )] = something substr( $string, $start, $stop ) # something # Note: wouldn't work because the function returns a string. # I just don't know what the function returns. # so exec("print " +substr( $string, $start, $stop ) I guess # similarly, and possibly a little better practice locals()["somethingdif"] = somethingelse somethingdif # somethingelse 

Para mitigar las votaciones masivas, debo mencionar que puedes arruinar totalmente tu progtwig con esto. Pero probablemente lo sepas. Solo asegúrese de no sobrescribir las variables existentes al usar este método marcando "somevar" not in locals() o "somevar" not in globals() .