2010-09-09 8 views
11

मैं django के बारे में एक अन्य जादू की बात समझने की कोशिश कर रहा हूं: यह तारों को मॉड्यूल में परिवर्तित कर सकता है।django स्ट्रिंग को मॉड्यूल में कैसे परिवर्तित करता है

settings.py में, INSTALLED_APPS ऐसे ही घोषित किया जाता है:

INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
) 

सभी इसमें तार है। लेकिन django उन तारों को मॉड्यूल में परिवर्तित कर देगा और बाद में आयात करेगा।

मैं वही काम करने में सक्षम होना चाहता हूं। लेकिन मुझे नहीं पता कि कैसे। मैं settings.py में रेंडरर डिस्पैचर का एक शब्दकोश है:

RESOUCE_RENDERER = { 
    'video': 'video_player', 
    'audio': 'audio_player', 
} 

मैं इस तरह बाद में इसका उपयोग करना चाहते: RESOURCE_RENDERER['video'](MyVideo)

मैं सीधे फ़ंक्शन नाम (जैसे video_player) असाइन नहीं कर सकता क्योंकि यह उस मॉड्यूल में रहता है जिसके लिए settings.py की आवश्यकता होती है।

उत्तर

8

चूंकि Django 1.7 a simple function for this है। उदाहरण के लिए:

from django.utils.module_loading import import_string 
my_module = import_string('path.to.my_module') 

तुम भी मॉड्यूल से कक्षाएं प्राप्त कर सकते हैं:

MyClass = import_string('path.to.my_module.MyClass') 
8

django.conf.__init__.py में एक नजर डालें, लेकिन मूल रूप से यह importlib इसलिए की तरह उपयोग करता है:

try: 
    mod = importlib.import_module(self.SETTINGS_MODULE) 
except ImportError, e: 
    raise ImportError("Could not import settings '%s' 
       (Is it on sys.path? Does it have syntax errors?): 
       %s" % (self.SETTINGS_MODULE, e)) 

# Settings that should be converted into tuples if they're mistakenly entered 
# as strings. 
tuple_settings = ("INSTALLED_APPS", "TEMPLATE_DIRS") 

संपादित: ओपी के अनुरोध पर मैं उदाहरण विस्तार किया है और कुछ और नीचे योगदान किया है।

अब, मान लें कि आपके पास इस मॉड्यूल में फ़ंक्शंस की एक सूची थी, उदाहरण के लिए फ़ंक्शंस टू कॉल, फ़ंक्शंस की एक सूची। फिर, आप इस तरह प्रत्येक को कॉल कर सकते हैं:

ARGUMENTS = '()' 

for FUNCTION in FUNCTIONS_TO_CALL: 
    function_string = FUNCTION + ARGUMENTS 
    exec(function_string) 

यह मानता है कि प्रत्येक फ़ंक्शन में परिभाषित तर्कों का एक ही सेट होता है। आप उपयोगकर्ता द्वारा सूचीबद्ध फ़ंक्शन नाम का पता लगाने के लिए एक कथन का उपयोग कर सकते हैं और यह क्या है इसके आधार पर कस्टम तर्क प्रदान करते हैं। आप पाइथन फ़ाइल को पढ़ने से भी मूल्यांकन कर सकते हैं कि तर्क क्या होना चाहिए।

आप मॉड्यूल ऑब्जेक्ट को भी देख सकते हैं (मुझे लगता है कि यह संभव है, मुझे नहीं पता) देखें कि यह फ़ंक्शन exec() या eval() पर कॉल करने से पहले मौजूद है या नहीं। मुझे नहीं पता, फिर, अगर कोई फंक्शन ऑब्जेक्ट से मूल्यांकन कर सकता है तो कौन से तर्क लेते हैं। मुझे संदेह है, लेकिन यह एक अलग (संभवतः पहले ही उत्तर दिया गया है) प्रश्न है।

+0

@Ninefingers, इस में मदद मिलेगी, लेकिन मैं कार्यों आयात करने के लिए देख रहा हूँ, केवल मॉड्यूल नहीं। क्या आप जानते हैं कि मैं इसे कैसे प्राप्त कर सकता हूं? – maroxe

+0

मुझे लगता है कि __import__ वह है जिसे मैं – maroxe

+0

देख रहा हूं हां और नहीं। आयात कथन importlib फ़ंक्शंस के लिए एक रैपरराउंड है, जैसे, जब आप मज़ेदार आयात_ मॉड्यूल करते हैं * * ने एक वैरिएबल मॉड्यूल आयात किया है * जैसा कि * आपने "कुछ आयात योग्य" के लिए कहा था। मुझे नहीं लगता कि आप 'परिवर्तनीय नाम' आयात कर सकते हैं लेकिन आप इस पुस्तकालय के माध्यम से कर सकते हैं। अब, एक बार जब आप एक मॉड्यूल आयात कर लेते हैं तो आपके पास सब कुछ तक पहुंच है - मैंने उपरोक्त उदाहरण का विस्तार किया है ताकि कोड फ़ाइल में 'INSTALLED_APPS' तक पहुंचने वाले कोड को शामिल किया जा सके, जैसा आपने क्यू में चर्चा की थी। –

संबंधित मुद्दे