El jue., 18 jul. 2019 a las 2:23, AGTUGO (<agt...@gmail.com>) escribió:
> La raz'on es eliminar esa dependencia porque nadie de mis colaboradores > conoce Jinja2, y en este momento no cuentan con el tiempo para entenderlo. > Pero bueno eso ya es otro tema. Pero s'i la mejor soluci'on sigue siendo > Jinja > Respondiendo a la pregunta primera, las *f-strings* también se pueden crear con triples comillas (eg: f"""void {saludo}{{std::cout << "{saludo}\n"}};""" ). Pero con cuidado. En tu cadena tienes un caracter de fin de línea. Lo recomendable es usar cadenas *raws* para evitar sorpresas: rf"""void {saludo}{{std::cout << "{saludo}\n"}};""" Las *f-strings* tienen sus limitaciones, que algo se mejorará con los llamados *f-literals*. De todos modos, no se resuelven los problemas de seguridad, inherentes al modo en que se formatean las strings. Si realmente buscas un reemplazo de Jinja para impacientes, mírate los *Templates[1]*. El código anterior se vería así: from string import Template code = Template("""void ${saludo}{std::cout << "${saludo}\n"};""").substitute(saludo="hola") Dentro de lo simple que parece, como primer argumento del *.substitute* se puede pasar un *mapping (aka diccionario)* que puedes programar como un objeto cuyo método __getitem__ procese la sustitución como necesites. Por ejemplo: class Upper(dict): def __getitem__(self, s): return s.upper() upper = Upper() code = Template("""void ${main}{std::cout << "${saludo}\n"};""").substitute(upper) Da como resultado: void MAIN{std::cout << "SALUDO\n"}; Si aún así se queda corto, también se puede derivar la clase Template para adaptarla mejor todavía. Por ejemplo, para cambiar delimitadores, cambiar la expresión regular para detectar patrones a sustituir, etc. Por ejemplo, para usar delimitadores '%% ... %%' y '%%[ ... ]%%': class T(Template): pattern = r""" %%(?: (?P<escaped>%%) | # repetición del delimitador (?P<named>\w+?)%% | # encontrado patrón %% \[(?P<braced>.+?)\]%% | # encontrado patrón %%[ (?P<invalid>^$) # inválido salto de línea ) """ El delimitador %%..%% encierra únicamente palabras, mientras que %%[..]%% puede delimitar cualquier cosa: code = T(r"""void %%main%%{std::cout << %%[value % 5]%%};""" ).substitute(upper) dará void MAIN{std::cout << VALUE % 5}; [1]: https://docs.python.org/3.7/library/string.html#template-strings > > On Tue, Jul 16, 2019 at 12:49 AM lasizoillo <lasizoi...@gmail.com> wrote: > >> Buenas, >> >> Creo conveniente leer esto antes que nada >> http://lucumr.pocoo.org/2016/12/29/careful-with-str-format/ >> >> El mar., 16 jul. 2019 a las 7:27, Sergio Fernández (<ser...@wikier.org>) >> escribió: >> >>> Un f-string es código, no un string. Yo no seguiría ese camino... es una >>> mala idea y potencialmente un riesgo. >>> >>> ¿Por qué no seguir con Jinja? >>> >> >> Correcto, son potencialmente un riesgo, pero como ponen en el ejemplo >> sobre todo porque implican extender string.Formatter y que incluso el >> código que no use f-strings puede verse afectado por el cambio :-O >> >> >>> On Mon, Jul 15, 2019, 20:05 AGTUGO <agt...@gmail.com> wrote: >>> >>>> Dada la evaluación dentro de los f-strings, parece natural reemplazar >>>> los lenguajes de plantillas, como Jinja2 con f-string, con simplemente unos >>>> ajustes, excepto: >>>> >>>> >> No, no resulta natural reemplazar un lenguaje de plantillas por algo que >> no te ofrece una sandbox, sentencias de control, separación entre el parseo >> del template (se realiza una sola vez y se cachea) y su uso, template >> loaders personalizables,... >> >> Otra cosa es que en tu caso particular no utilices casi nada de lo que te >> ofrece el sistema de plantillas y puedas quitarte una dependencia extra. >> Pero creo que sería un caso bastante alejado de la norma. >> >> >>> Convertir de manera limpia los strings a f-strings. >>>> >>>> La única manera que he encontrado es usar eval, ¿Alguien tiene una idea >>>> mejor? >>>> >>> >> Usar string.Formatter, pero si y solo si no te vas a disparar en el pié >> al hacerlo. >> >> >>> >>>> Resultado deseado = void hola{ std::cout << "hola\n"}; >>>> F-string para generarlo = f"void{saludo}{{std::cout << "{saludo}\n"}};" >>>> Ejemplo Jinja = void {{saludo}}{std::cout <<"{{saludo}}\n"};" >>>> >>>> -- >>>> Arturo Muñoz >>>> _______________________________________________ >>>> Python-es mailing list >>>> Python-es@python.org >>>> https://mail.python.org/mailman/listinfo/python-es >>>> >>> _______________________________________________ >>> Python-es mailing list >>> Python-es@python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> >> _______________________________________________ >> Python-es mailing list >> Python-es@python.org >> https://mail.python.org/mailman/listinfo/python-es >> > > > -- > Arturo Muñoz Tolosa > _______________________________________________ > Python-es mailing list > Python-es@python.org > https://mail.python.org/mailman/listinfo/python-es > -- Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": https://blog.ch3m4.org Buscador Python Hispano: http://busca.ch3m4.org <https://blog.ch3m4.org/pages/busqueda-python-es/>
_______________________________________________ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es