with tutorial para framework español djangoproject con applications python string-formatting local-variables locals

python - para - tutorial django



Uso del método locals() y format() para cadenas: ¿hay alguna advertencia? (4)

¿Hay alguna desventaja, advertencias o advertencias de mala práctica sobre el uso del siguiente patrón?

def buildString(user, name = ''john'', age=22): userId = user.getUserId() return "Name: {name}, age: {age}, userid:{userId}".format(**locals())

Tenía un código de generación de cadenas muy repetitivo para escribir y estaba tentado de usarlo, pero algo sobre el uso de locals() me hace sentir incómodo. ¿Hay algún peligro de comportamiento inesperado en esto?

Editar: contexto

Me encontré constantemente escribiendo cosas como:

"{name} {age} {userId} {etc}...".format(name=name, age=age, userId=userId, etc=etc)


Ahora hay una forma oficial de hacerlo, a partir de Python 3.6.0: literales de cadena formateados .

Funciona así:

f''normal string text {local_variable_name}''

Por ejemplo, en lugar de estos:

"hello %(name)s you are %(age)s years old" % locals() "hello {name}s you are {age}s years old".format(**locals())

solo haz esto:

f"hello {name}s you are {age}s years old"

Aquí está el ejemplo oficial:

>>> name = "Fred" >>> f"He said his name is {name}." ''He said his name is Fred.'' >>> width = 10 >>> precision = 4 >>> value = decimal.Decimal("12.34567") >>> f"result: {value:{width}.{precision}}" # nested fields ''result: 12.35''

Referencia:


Esto es muy antiguo, pero si te encuentras usando .format la única advertencia que he encontrado al .format **locals es que si no tienes esa variable definida en algún lugar, se romperá. Explicar explícitamente qué variables se pasan evitará esto en la mayoría de los IDEs modernos.

foo = "bar" "{foo} and {baz} are pair programming".format(**locals()) <exception occurs>



Si el string de formato no es proporcionado por el usuario, este uso está bien.

format es preferible a usar el % para la sustitución de cadenas.
locals están integrados en Python y su comportamiento será confiable.

Creo que los locals hacen exactamente lo que necesitas.
Simplemente no modifique el diccionario de los locales y yo diría que tiene una solución bastante buena.

Si la cadena de formato es proporcionada por el usuario, usted es susceptible a ataques de inyección de todo tipo de maldad.