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

¿Hay desventajas, 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 tuve la tentación de usar esto, 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 hacer esto, a partir de Python 3.6.0: literales de cadena con formato .

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()) "hello {name}s you are {age}s years old".format(name=name, age=age) 

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:

  • Python 3.6 Lo nuevo
  • PEP 498
  • Descripción del análisis léxico

Si la cadena de formato no es suministrada por el usuario, este uso está bien.

Se prefiere el format en lugar del antiguo % para la sustitución de cadenas.
locals están incorporados a Python y su comportamiento será confiable.

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

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

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.

Pre Python 3.6 respuesta

Esto es muy antiguo, pero si se encuentra usando .format una de las advertencias que encontré al pasar a los **locals es que si no tiene esa variable definida en algún lugar, se romperá. Indicar explícitamente en qué variables se pasan evitará esto en la mayoría de los IDEs modernos.

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