2010-05-26 24 views
16

__import__ का उपयोग करके निम्नलिखित निष्पादित करने का सबसे अच्छा तरीका क्या है ताकि मैं गतिशील रूप से मॉड्यूल निर्दिष्ट कर सकूं?* आयात करने के लिए * __import__

from module import * 
+3

लेकिन आप जानते हैं कि आप का उपयोग कर 'आयात *' बचना चाहिए रहे हैं? –

+8

एक अर्थशास्त्र व्याख्यान के लिए यहां नहीं :) –

+0

क्या आप इसे स्थानीय लोगों में चाहते हैं? आपको ऐसा करने की कोशिश नहीं करनी चाहिए, लेकिन माइकल मोरोज़ का जवाब वैसे भी पूरी तरह से गलत है। इग्नासिओ का जवाब स्वीकार किया जाना चाहिए। –

उत्तर

5

यह एक सामान्य से आयात कॉल की तरह ही है, तो आप सिर्फ यह fromlist के लिए '*' युक्त एक सूची पारित:

moduleName = "foo" 
__import__(moduleName, globals(), locals(), ['*']) 
+0

यह वास्तव में स्थानीय लोगों को स्थापित नहीं करता है() हालांकि, मेरे पास कौन सा मुद्दा है :) –

+0

दस्तावेज़ के अनुसार मानक '__import__' 'लोकल' तर्क का भी उपयोग नहीं करता है। यदि आप '__builtin __.__ import__' को ओवरराइड करते हैं, तो आप देख सकते हैं कि जब आप 'foo import * से' चलाते हैं तो वास्तव में क्या होता है, ऐसा लगता है कि –

+0

यह वास्तव में गुण आयात नहीं करता है, जो समस्या है। यह उन्हें स्मृति में लोड करता है लेकिन यह उन्हें मौजूदा मॉड्यूल स्थानीय() के तहत सेट नहीं करता है। –

4

__import__() कभी नहीं स्थानीय गुंजाइश के लिए कुछ भी कहते हैं। आपको वांछित मॉड्यूल के माध्यम से जाना होगा, वांछित के रूप में इसके गुणों का उपयोग करना होगा।

14

एक ही रास्ता मैंने पाया:

module = __import__(module, globals(), locals(), ['*']) 
for k in dir(module): 
    locals()[k] = getattr(module, k) 
+0

आप ऐसा क्यों करना चाहते हैं? मैं खराब कोड गंध करता हूँ। || दूसरी तरफ, अपने उत्तरों को स्वीकार करने के लिए स्वतंत्र महसूस करें। –

+5

क्योंकि संबोधित समस्या को हल करने का यही एकमात्र तरीका है। –

+0

यह चीजें जल्दी से करने के लिए सबसे अच्छा विकल्प लगता है। मुझे मिला दूसरा विकल्प यह है: "cmd = '% s आयात से *'% मॉड्यूलनाम; exec (cmd)"। हर कोई चिल्लाएगा लेकिन छोटी लिपियों के लिए यह सबसे अच्छा तरीका लगता है। – mathtick

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

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