[pyar] Analizador python para cambiar strings formateados

Juanjo Conti jjconti en gmail.com
Vie Jun 18 11:41:18 ART 2010


Ok, el subject del mail apesta.

Tomando lo que se discutió en el hilo sobre analizar código Python hice una
primera implementación:

http://svn.juanjoconti.com.ar/dyntaint/trunk/wrapstrings/

El objetivo original era meterse en el medio cuando python formatea strings.
Vimos que no se podía hacer cuando el operando izquierdo de % era un string
literal del tipo "algo % asi". Llegamos a que la única alternativa era
escribir unp rograma que analice código python y reemplace cosas como

"%s" % a

por

fun("%s") % a

Bien, esta parece que anda bastante bien. Utilizo el módulo ast para crear
el árbol AST a partir de un .py. Lo recorro en busca de operadores binarios,
cuando encuentro uno, si es del tipo ast.Mod, miro el elemento de la
izquierda, si es ast.Str lo reemplazo por un nodo del tipo ast.Call creado
con la función que quiera.

Ejemplo: http://svn.juanjoconti.com.ar/dyntaint/trunk/wrapstrings/ejemplo.py

Y el resultado de correr el script contra eso es:

$ python wrapstrings.py ejemplo.py m
def f():
    return 42
m('algo %s mas %s') % ('a', 'b')
f('algo %s mas %s') % ('a', 'b')

Luego me di cuenta, de que el string a la izquierda del % podía estar en una
variable:

variable % (a,a,a)

o ser el resultado de una llamada.

f() % (a,a,a)

u otra cosa.

Creo que el use case más común es cuando se usan strings directamente. De
todas formas le agregué un parámetro más al script, para que reemplace lo
que esté a la izquierda del operador % sea lo que sea.

$ python wrapstrings.py ejemplo.py m all
def f():
    return 42
m('algo %s mas %s') % ('a', 'b')
m(f('algo %s mas %s')) % ('a', 'b')

Qué piensan? Puede andar? Quieren probarlo con algún código suyo que tengan
a mano?

Alguna situación en la que esta manipulación afecte el funcionamiento,
semántica o validez del programa?

Saludos!
-- 
Juanjo Conti
blog: http://www.juanjoconti.com.ar
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20100618/2e28e67c/attachment.html>


More information about the pyar mailing list