सरल सामग्री को अधिक जटिल बनाने में मेरी अंतहीन खोज में, मैं पाइथन अंडे पैकेज में पाए गए 'config.py' के अंदर वैश्विक कॉन्फ़िगरेशन चर प्रदान करने के लिए सबसे अधिक 'पायथनिक' तरीका खोज रहा हूं।config.py में वैश्विक कॉन्फ़िगरेशन चर प्रदान करने के लिए सबसे पाइथोनिक तरीका?
from config import *
dbname = MYSQL_DATABASE
for table in MYSQL_DATABASE_TABLES:
print table
या:
MYSQL_PORT = 3306
MYSQL_DATABASE = 'mydb'
MYSQL_DATABASE_TABLES = ['tb_users', 'tb_groups']
इसलिए वैश्विक चर निम्न तरीकों में से एक में आयात किया जाता है:
परंपरागत तरीके से (! आह, अच्छा ol '#define) इस प्रकार है :
import config
dbname = config.MYSQL_DATABASE
assert(isinstance(config.MYSQL_PORT, int))
यह समझ में आता है, लेकिन कभी-कभी बी ई थोड़ा गन्दा, खासकर जब आप कुछ चर के नाम याद रखने की कोशिश कर रहे हैं। इसके अलावा, 'कॉन्फ़िगरेशन' ऑब्जेक्ट प्रदान करते हुए, गुणों के साथ गुणों के साथ, अधिक लचीला हो सकता है।
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'
और तो, bpython config.py फ़ाइल से एक का नेतृत्व लेने, मैं के साथ आया था इस तरह से इस्तेमाल किया जाता है:
from sqlalchemy import MetaData, Table
import config as CONFIG
assert(isinstance(CONFIG.mysql.port, int))
mdata = MetaData(
"mysql://%s:%[email protected]%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))
कौन सा भंडारण और एक पैकेज के अंदर वैश्विक चर प्राप्त करने में कठिनाई का एक, अधिक पठनीय अर्थपूर्ण और सुविधाजनक ढंग से लगता है।
कभी सबसे कमजोर विचार? इन स्थितियों से निपटने के लिए सबसे अच्छा अभ्यास क्या है? आपके आपके पैकेज के अंदर वैश्विक नाम और चर को संग्रहीत करने और लाने का तरीका क्या है?
आपने पहले से ही एक निर्णय लिया है कि शायद अच्छा हो या न हो। कॉन्फ़िगरेशन को अलग-अलग तरीकों से संग्रहीत किया जा सकता है, जैसे JSON, XML, * nixes और Windows के लिए अलग-अलग व्याकरण और इसी तरह। कॉन्फ़िगरेशन फ़ाइल (एक उपकरण, एक मानव, क्या पृष्ठभूमि?) लिखने के आधार पर विभिन्न व्याकरण बेहतर हो सकता है। प्रायः कॉन्फ़िगरेशन फ़ाइल को आपके प्रोग्राम के लिए उपयोग की जाने वाली भाषा में लिखित होने का अच्छा विचार नहीं हो सकता है, क्योंकि यह उपयोगकर्ता को बहुत अधिक शक्ति देता है (स्वयं क्या हो सकता है, लेकिन आप स्वयं को वह सब कुछ याद नहीं कर सकते जो आगे कुछ महीनों में गलत जाओ)। – erikbwork
अक्सर मैं एक JSON कॉन्फ़िगरेशन फ़ाइल लिखना समाप्त करता हूं। इसे पाइथन संरचनाओं में आसानी से पढ़ा जा सकता है और एक उपकरण द्वारा भी बनाया जा सकता है। ऐसा लगता है कि सबसे लचीलापन है और केवल लागत कुछ ब्रेसिज़ हैं जो उपयोगकर्ता को परेशान कर सकती हैं। हालांकि, मैंने कभी अंडे नहीं लिखा था। शायद यह मानक तरीका है। उस मामले में बस ऊपर मेरी टिप्पणी को अनदेखा करें। – erikbwork
आप "self.__ dict __। कुंजी()" – Karlisson