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>
Hago este tipo de cosas regularmente. El único problema que he tenido es que PyFlakes se quejará de las variables no utilizadas cuando lo haga.
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.