단순한 일을 지나치게 복잡하게 만드는 끝없는 탐구에서 저는 파이썬 달걀 패키지에 있는 전형적인 ' config.py ' 내부에 전역 구성 변수를 제공하는 가장 ' 파이 토닉'방법을 연구하고 있습니다.
전통적인 방법 (aah, good ol ' #define !)은 다음과 같습니다.
MYSQL_PORT = 3306
MYSQL_DATABASE = 'mydb'
MYSQL_DATABASE_TABLES = ['tb_users', 'tb_groups']
따라서 전역 변수는 다음 방법 중 하나로 가져옵니다.
from config import *
dbname = MYSQL_DATABASE
for table in MYSQL_DATABASE_TABLES:
print table
또는:
import config
dbname = config.MYSQL_DATABASE
assert(isinstance(config.MYSQL_PORT, int))
이치에 맞지만, 특히 특정 변수의 이름을 기억하려고 할 때 약간 지저분해질 수 있습니다. 게다가하는 제공하는 '구성'개체 와, 속성으로 변수를 보다 유연 수 있습니다. 따라서 bpython config.py 파일 에서 주도권을 잡고 다음 을 생각해 냈습니다 .
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)])
클래스를 가져오고 다음과 같이 읽는 'config.py':
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'
다음과 같이 사용됩니다.
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))
패키지 내에서 전역 변수를 저장하고 가져 오는 더 읽기 쉽고 표현력 있고 유연한 방법 인 것 같습니다.
가장 빈약 한 아이디어? 이러한 상황에 대처하기위한 모범 사례는 무엇입니까? 무엇 당신의 저장 및 글로벌 이름과 변수 패키지 내부를 가져 오는 방식은?