Como goldmab señaló, modificando la salida de gente() dentro de una función no funcionará:
SyntaxError: invalid syntax
>>> def foo():
... locals().update({'a': 1})
... print a
...
>>> foo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in foo
NameError: global name 'a' is not defined
Esto no es realmente una manera muy limpia, pero sería hacer el trabajo:
>>> def foo():
... options = {'DATABASES': {'default': {'ENGINE': 'django.db.backends.sqlite3'}}}
... for k, v in options.items():
... exec('%s = v' % k)
... print DATABASES
...
>>> foo()
{'default': {'ENGINE': 'django.db.backends.sqlite3'}}
Tenga en cuenta, por cierto, que cada tecla en su dict debería estar bien como una variable. Entonces, por ejemplo, si el diccionario contiene 'DATABASE-USERNAME' como clave, intentar asignar eso a una variable provocaría una excepción. Además, hacer esto lo haría vulnerable a los ataques de inyección de código si obtiene el diccionario de opciones de una fuente no confiable. (Una de las claves podría decir algo como, "import os; os.system ('sudo adduser Script Kiddie'); ..."
La mejor manera es no hacer este tipo de cosas peligrosas en el primer lugar. Y afortunadamente, una función por sí sola no podrá jugar con el espacio de nombres actual (de hecho, puede hacerlo con el global y quizás con más si usa el hacker de reflexión maligna, ¡pero no lo piense!) – delnan
@ delnan Entiendo que usar locals() es feo.Mira, después de analizar un archivo de configuración, obtengo un diccionario de opciones, así que ¿cómo se pueden reemplazar los valores predeterminados en la configuración sin usar los locales?) ¿ –
? Mejor que no lo haga. Porque hacerlo significa sobrescribir sus variables con la entrada del usuario, que está solo un paso por encima de 'eval'. Solo continúa con el diccionario. – delnan