bir işlev içinde yerli çıkışı() çalışmaz değiştirerek kaydetti:
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
Bu gerçekten ya çok temiz bir yol değildir, ancak iş yapacağını:
>>> 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'}}
Bu arada, bu arada, kodunuzdaki her anahtarın bir değişken olarak iyi olması gerekir. Örneğin, sözlüğün bir anahtar olarak "DATABASE-USERNAME" içermesi durumunda, bunu bir değişkene atamaya çalışmak istisna teşkil eder. Dahası, bu, güvenilir olmayan bir kaynaktan gelen seçenekler sözlüğünü alırsanız, kod enjeksiyon saldırılarına karşı sizi savunmasız yapar. (Bir anahtar gibi bir şey söyleyebiliriz "ithal os; os.system ('sudo İÇİNadduser ScriptKiddie'); ..."
iyi yolu ilk etapta böyle tehlikeli şeyler yapmak değil. Ve neyse ki, tek başına bir işlev geçerli ad alanı ile dalga geçmeyi başaramayacak (aslında, küresel bir ve belki de kötü yansıma korsanlığı kullanırsanız daha fazlası ile olabilir, ama bunu düşünmeyin!) – delnan
@ delnan yerliler kullanarak anlıyorum() çirkin.Bak, bir config dosyasını ayrıştırdıktan sonra seçenekler sözlüğünü alıyorum, bu yüzden ayarlarda varsayılan değerlerin değerlerini yerlileri kullanarak nasıl değiştirebiliriz() ¿ –
Daha iyi yapmayın. Çünkü bunu yapmak, değişkenlerinizi kullanıcı girdisi üzerine yazmanız anlamına gelir; bu, 'eval''ın yalnızca bir adım ötesindedir. Sadece sözlüğe devam et. – delnan