python - print - F-cuerdas anidadas
python print f (4)
Gracias al tweet de David Beazley , recientemente descubrí que las nuevas cadenas f de Python 3.6 también se pueden anidar:
>>> price = 478.23
>>> f"{f''${price:0.2f}'':*>20s}"
''*************$478.23''
O:
>>> x = 42
>>> f''''''-{f"""*{f"+{f''.{x}.''}+"}*"""}-''''''
''-*+.42.+*-''
Si bien me sorprende que esto sea posible, no entiendo qué tan práctico es eso, ¿cuándo sería útil anidar cuerdas? ¿Qué casos de uso puede cubrir esto?
Nota: El PEP en sí mismo no menciona anidar cadenas-f, pero hay un caso de prueba específico .
De hecho, acabo de encontrar algo similar (creo) y pensé que lo compartiría.
Mi caso específico es una gran declaración sql sucia donde necesito tener valores muy diferentes de forma condicional, pero algunas cadenas son las mismas (y también se usan en otros lugares).
Aquí está un ejemplo rápido de lo que quiero decir. Los cols que estoy seleccionando son los mismos independientemente (y también se usan en otras consultas en otros lugares) pero el nombre de la tabla depende del grupo y no es así, podría simplemente hacerlo en un bucle.
Tener que incluir mycols=mycols
en mycols=mycols
cada vez me sentía un poco sucio cuando tengo varios de estos parámetros.
No estaba seguro de que esto funcionaría, pero estaba feliz de haberlo hecho. En cuanto a cómo es de pythonic, no estoy realmente seguro de tbh.
mycols=''col_a,col_b''
str1 = "select {mycols} from {mytable} where group=''{mygroup}''".format(mycols=mycols,mytable=''{mytable}'',mygroup=''{mygroup}'')
group = ''group_b''
if group == ''group_a'':
str2 = str1.format(mytable=''tbl1'',mygroup=group)
elif group == ''group_b'':
str2 = str1.format(mytable=''a_very_different_table_name'',mygroup=group)
print(str2)
No creo que los literales de cadenas formateados que permiten el anidamiento (al anidar, lo tomo como f''{f".."}''
) es el resultado de una cuidadosa consideración de posibles casos de uso, estoy más convencido de que solo está permitido en Ordenar para que se ajusten a sus especificaciones.
La especificación establece que admiten expresiones de Python completas entre paréntesis. También se afirma que un literal de cadena formateada es en realidad solo una expresión que se evalúa en tiempo de ejecución (consulte here y here ). Como resultado, solo tiene sentido permitir un literal de cadena formateado como la expresión dentro de otro literal de cadena formateado, que prohíbe negar el soporte completo para las expresiones de Python.
El hecho de que no pueda encontrar casos de uso mencionados en los documentos (y solo encuentre casos de prueba en el conjunto de pruebas) se debe a que este es probablemente un buen efecto (lateral) de la implementación y no es un caso de uso motivador.
Puedes usarlo para el dinamismo. Por ejemplo, supongamos que tiene una variable configurada para el nombre de alguna función:
func = ''my_func''
Entonces podrías escribir:
f"{f''{func}''()}"
que sería equivalente a:
''{}''.format(locals()[func]())
o equivalente:
''{}''.format(my_func())
Supongo que esto es para pasar los parámetros de formateo en la misma línea y así simplificar el uso de f-strings .
Por ejemplo:
>>> import decimal
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result: {value:{width}.{precision}}"
''result: 12.35''
Por supuesto, permite a los programadores escribir código absolutamente ilegible, pero ese no es el propósito :)