In meiner endlosen Suche nach überkomplizierten einfachen Dingen erforsche ich die 'Pythonic'-Methode, um globale Konfigurationsvariablen innerhalb der typischen' config.py ' bereitzustellen , die in Python-Ei-Paketen zu finden ist.
Der traditionelle Weg (aah, good ol ' #define !) Ist wie folgt:
MYSQL_PORT = 3306
MYSQL_DATABASE = 'mydb'
MYSQL_DATABASE_TABLES = ['tb_users', 'tb_groups']
Daher werden globale Variablen auf eine der folgenden Arten importiert:
from config import *
dbname = MYSQL_DATABASE
for table in MYSQL_DATABASE_TABLES:
print table
oder:
import config
dbname = config.MYSQL_DATABASE
assert(isinstance(config.MYSQL_PORT, int))
Es ist sinnvoll, kann aber manchmal etwas chaotisch sein, insbesondere wenn Sie versuchen, sich die Namen bestimmter Variablen zu merken. Außerdem kann die Bereitstellung eines Konfigurationsobjekts mit Variablen als Attributen flexibler sein. Also, eine Leitung von der Einnahme bpython config.py Datei, kam ich mit:
class Struct(object):
def __init__(self, *args):
self.__header__ = str(args[0]) if args else None
def __repr__(self):
if self.__header__ is None:
return super(Struct, self).__repr__()
return self.__header__
def next(self):
""" Fake iteration functionality.
"""
raise StopIteration
def __iter__(self):
""" Fake iteration functionality.
We skip magic attribues and Structs, and return the rest.
"""
ks = self.__dict__.keys()
for k in ks:
if not k.startswith('__') and not isinstance(k, Struct):
yield getattr(self, k)
def __len__(self):
""" Don't count magic attributes or Structs.
"""
ks = self.__dict__.keys()
return len([k for k in ks if not k.startswith('__')\
and not isinstance(k, Struct)])
und eine 'config.py', die die Klasse importiert und wie folgt lautet:
from _config import Struct as Section
mysql = Section("MySQL specific configuration")
mysql.user = 'root'
mysql.pass = 'secret'
mysql.host = 'localhost'
mysql.port = 3306
mysql.database = 'mydb'
mysql.tables = Section("Tables for 'mydb'")
mysql.tables.users = 'tb_users'
mysql.tables.groups = 'tb_groups'
und wird folgendermaßen verwendet:
from sqlalchemy import MetaData, Table
import config as CONFIG
assert(isinstance(CONFIG.mysql.port, int))
mdata = MetaData(
"mysql://%s:%s@%s:%d/%s" % (
CONFIG.mysql.user,
CONFIG.mysql.pass,
CONFIG.mysql.host,
CONFIG.mysql.port,
CONFIG.mysql.database,
)
)
tables = []
for name in CONFIG.mysql.tables:
tables.append(Table(name, mdata, autoload=True))
Dies scheint eine lesbarere, aussagekräftigere und flexiblere Methode zum Speichern und Abrufen globaler Variablen in einem Paket zu sein.
Die lahmste Idee überhaupt? Was ist die beste Vorgehensweise, um mit diesen Situationen umzugehen? Wie können Sie globale Namen und Variablen in Ihrem Paket speichern und abrufen?