print - python string format
¿Puedo importar los literales de cadena formateada de Python 3.6(f-strings)? (5)
Acabo de escribir un compilador de puerto trasero para f-string , llamado f2format
. Del mismo modo que usted lo solicita, puede escribir literales f-string en el sabor de Python 3.6 y compilar en una versión compatible para que los usuarios finales ejecuten, al igual que Babel
para JavaScript.
f2format
proporciona una solución inteligente, pero imperfecta, de un compilador de puerto trasero . Reemplazará los literales f-string con métodos de str.format
cadena , mientras mantiene el diseño original del código fuente. Usted puede simplemente utilizar
f2format /path/to/the/file_or_directory
que reescribirá todos los archivos de Python en su lugar. Por ejemplo,
var = f''foo{(1+2)*3:>5}bar{"a", "b"!r}boo''
será convertido a
var = (''foo{:>5}bar{!r}boo'').format(((1+2)*3), ("a", "b"))
La concatenación de cadenas, la conversión, la especificación de formato, las líneas múltiples y los unicodes se tratan correctamente. Además, f2format
archivará los archivos originales en caso de que existan violaciones de sintaxis.
Los nuevos f-strings de Python 3.6 me parecen un gran salto en la usabilidad de las cuerdas, y me encantaría saltarlos y adoptarlos de todo corazón en nuevos proyectos que podrían estar funcionando en intérpretes más antiguos. 2.7, 3.3-3.5 el soporte sería genial, pero al menos me gustaría usarlos en las bases de código de Python 3.5. ¿Cómo puedo importar literales de cadena con formato 3.6 para que los usen intérpretes más antiguos?
Entiendo que los literales de cadena con formato como f"Foo is {age} {units} old"
no están rompiendo cambios, por lo que no se incluirían en una from __future__ import ...
Pero el cambio no es back-port (AFAIK). Debería estar seguro de que cualquier código nuevo que escriba con f-strings solo se ejecute en Python 3.6+, que es un factor decisivo para muchos proyectos.
Desafortunadamente, si desea usarlo, debe requerir Python 3.6+
, igual con el operador de multiplicación de matrices @
y Python 3.5+
o yield from
( Python 3.4+
, creo)
Éstos hicieron cambios en la forma en que se interpreta el código y, por lo tanto, lanzan SyntaxErrors cuando se importan en versiones anteriores. Eso significa que debes colocarlos en un lugar donde no se importen en Pythons antiguos ni estén protegidos por una eval
o un exec
(¡no recomendaría los dos últimos!).
Así que sí, tienes razón, si quieres admitir varias versiones de python no puedes usarlas fácilmente.
Las cadenas de caracteres son creadas por el intérprete al tocar el prefijo f
: esa característica por sí sola eliminará cualquier posibilidad de compatibilidad.
Su disparo más cercano es utilizar el formato de palabras clave, como
''Foo is {age} {units} old''.format(age=age, units=units)
lo que puede ser refaccionado más fácilmente al terminar el requisito de compatibilidad.
esto es lo que yo uso:
text = "Foo is {age} {units} old".format(**locals())
desempaqueta ( **
) el dict devuelto por locals()
que tiene todas sus variables locales como un dict {variable_name: value}
Tenga en cuenta que esto no funcionará para las variables declaradas en un ámbito externo, a menos que lo importe al ámbito local con nonlocal
(Python 3.0+).
también puedes usar
text.format(**locals(),**globals())
para incluir variables globales en tu cadena.
future-fstrings trae f-strings a los scripts de Python 2.7. (Y supongo 3.3-3.5 basado en la documentación.)
Una vez que lo instale a través de pip install future-fstrings
, debe colocar una línea especial en la parte superior de su código. Esa línea es:
# -*- coding: future_fstrings -*-
Luego, puede usar literales de cadena con formato (f-cadenas) dentro de su código:
# -*- coding: future_fstrings -*-
var = ''f-string''
print(f''hello world, this is an {var}'')