Ich bin relativ neu in Python. Ich möchte ein "Einstellungs" -Modul erstellen, in dem verschiedene anwendungsspezifische Konstanten gespeichert werden.
So möchte ich meinen Code einrichten:
settings.py
CONSTANT = 'value'
script.py
import settings
def func():
var = CONSTANT
# do some more coding
return var
Ich erhalte eine Python-Fehlermeldung mit folgenden Angaben:
global name 'CONSTANT' is not defined.
Ich habe im Quellcode von Django festgestellt, dass ihre settings.py
Datei Konstanten hat, die genau wie ich benannt sind. Ich bin verwirrt darüber, wie sie in ein Skript importiert und über die Anwendung referenziert werden können.
BEARBEITEN
Vielen Dank für all Ihre Antworten! Ich habe folgendes versucht:
import settings
print settings.CONSTANT
Ich bekomme den gleichen Fehler
ImportError: cannot import name CONSTANT
AttributeError
if erhalten,settings
das nicht definiert ist,CONSTANT
und einImportError
if, das keine Einstellungen importieren kann. In diesem Fall würde es nicht einmalCONSTANT
Antworten:
Der einfachste Weg, dies zu tun, besteht darin, Einstellungen nur als Modul zu verwenden.
(settings.py)
CONSTANT1 = "value1" CONSTANT2 = "value2"
(consumer.py)
import settings print settings.CONSTANT1 print settings.CONSTANT2
Wenn Sie ein Python-Modul importieren, müssen Sie den Variablen, die Sie daraus ziehen, den Modulnamen voranstellen. Wenn Sie genau wissen, welche Werte Sie in einer bestimmten Datei daraus verwenden möchten, und sich keine Sorgen darüber machen, dass sie sich während der Ausführung ändern, können Sie dies tun
from settings import CONSTANT1, CONSTANT2 print CONSTANT1 print CONSTANT2
aber ich würde mich nicht von dem letzten mitreißen lassen. Es macht es für Leute, die Ihren Code lesen, schwierig zu erkennen, woher Werte kommen. und schließt aus, dass diese Werte aktualisiert werden, wenn ein anderes Client-Modul sie ändert. Ein letzter Weg, dies zu tun, ist
import settings as s print s.CONSTANT1 print s.CONSTANT2
Dies erspart Ihnen die Eingabe, verbreitet Aktualisierungen und erfordert nur, dass sich die Leser daran erinnern, dass alles, was danach
s
kommt, aus dem Einstellungsmodul stammt.quelle
#database configuration settings database = dict( DATABASE = "mysql", USER = "Lark", PASS = "" ) #application predefined constants app = dict( VERSION = 1.0, GITHUB = "{url}" )
import settings as s # s is aliasing settings & settings is the actual file you do not have to add .py print(s.database['DATABASE']) # should output mysql print(s.app['VERSION']) # should output 1.0
Wenn Sie keinen Alias wie s verwenden möchten, können Sie eine andere Syntax verwenden
from settings import database, app print(database['DATABASE']) # should output mysql print(app['VERSION']) # should output 1.0
Beachten Sie, dass Sie bei der zweiten Importmethode die Diktatnamen direkt verwenden können
Ein kleiner Tipp: Sie können den gesamten Code in die Einstellungsdatei mit * importieren, falls Sie eine große Datei haben und die meisten Einstellungen in Ihrer Anwendung verwenden
from settings import * # * represent all the code on the file, it will work like step 2 print(database['USER']) # should output lark print(app['VERSION']) # should output 1.0
Ich hoffe das hilft.
quelle
Wenn Sie
import settings
, wird einmodule
aufgerufenes Objektsettings
in den globalen Namespace gestellt - und dieses Objekt trägt dassettings.py
als Attribute. Dh außerhalb vonsettings.py
, bezeichnen SieCONSTANT
alssettings.CONSTANT
.quelle
Lassen Sie Ihre settings.py genau so wie sie ist, dann können Sie sie genauso verwenden wie Django:
import settings def func(): var = settings.CONSTANT
quelle
... Oder wenn Sie wirklich möchten, dass alle Konstanten aus settings.py in den globalen Namespace importiert werden, können Sie ausführen
from settings import *
... aber ansonsten ist die Verwendung
settings.CONSTANT
, wie alle anderen hier erwähnt haben, ganz richtig.quelle
import
Anweisung zu verwenden.Siehe die Antwort, die ich an gepostet habe. Kann ich verhindern, dass ein Objekt in Python geändert wird? was macht, was Sie wollen (sowie die Verwendung von Großbuchstaben erzwingen). Es könnte tatsächlich eine bessere Antwort auf diese Frage sein als für die andere.
quelle
Ich bin neu in Python, aber wenn wir eine Konstante wie eine Funktion in setings.py definieren
def CONST1(): return "some value"
main.py.
import setings print setings.CONST1() ##take an constant value
hier sehe ich nur einen, Wert kann nicht geändert werden, aber seine Arbeit wie eine Funktion ..
quelle
Dieser Weg ist effizienter, da Ihre Einstellungsvariablen nur einmal geladen / ausgewertet werden. Es funktioniert gut für alle meine Python-Projekte.
Dokumente hier: https://github.com/charlsagente/python-settings
Sie benötigen eine settings.py-Datei mit all Ihren definierten Konstanten wie:
# settings.py DATABASE_HOST = '10.0.0.1'
Anschließend müssen Sie entweder eine env-Variable festlegen (SETTINGS_MODULE = settings exportieren) oder die configure-Methode manuell aufrufen:
# something_else.py from python_settings import settings from . import settings as my_local_settings settings.configure(my_local_settings) # configure() receives a python module
Das Dienstprogramm unterstützt auch die Lazy-Initialisierung für schwer zu ladende Objekte. Wenn Sie also Ihr Python-Projekt ausführen, wird es schneller geladen, da die Einstellungsvariable nur bei Bedarf ausgewertet wird
# settings.py from python_settings import LazySetting from my_awesome_library import HeavyInitializationClass # Heavy to initialize object LAZY_INITIALIZATION = LazySetting(HeavyInitializationClass, "127.0.0.1:4222") # LazySetting(Class, *args, **kwargs)
Konfigurieren Sie einfach einmal und rufen Sie jetzt Ihre Variablen auf, wo dies erforderlich ist:
# my_awesome_file.py from python_settings import settings print(settings.DATABASE_HOST) # Will print '10.0.0.1'
quelle
Versuche dies:
In settings.py:
CONSTANT = 5
In Ihrer Hauptdatei:
from settings import CONSTANT class A: b = CONSTANT def printb(self): print self.b
Ich denke, Ihr obiger Fehler kommt von der Einstellungsdatei, die zu spät importiert wird. Stellen Sie sicher, dass es sich oben in der Datei befindet.
quelle
Ebenfalls einen Besuch wert ist das Projekt mit einfachen Einstellungen, mit dem Sie die Einstellungen bei Runtim in Ihr Skript einspeisen können, das umgebungsspezifische Einstellungen ermöglicht (denken Sie an dev, test, prod, ...).
quelle