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

Responder a