2011-08-15 27 views
5

मेरे पास एक मॉड्यूल है जो लगभग उपयोगिता प्रकार कार्यों और कोर एपीआई कार्यों के बीच आधे हिस्से में विभाजित है। मुझे __all__ में help() उपयोगी होने के लिए, और यह भी निर्दिष्ट करने के लिए कि मॉड्यूल में कौन से फ़ंक्शन/कक्षाएं/आदि बाहरी उपयोग के लिए हैं, लेकिन मैं भी from mymodule import * का समर्थन करने के तरीके के रूप में समर्थन करना चाहता हूं अन्य मॉड्यूल में सिर्फ कोर कार्यक्षमता। क्या ऐसा करने के लिए कोई रास्ता है?एक मॉड्यूल में __all__ से 'से ... आयात *' api अलग कैसे परिभाषित करें?

उत्तर

4

लगभग। एक ओर जहां आप __all__ इस तरह से दोहरा काम करना नहीं हो सकता है, आप अपने खुद आभासी एपीआई मॉड्यूल जो तब आयात किया जा सकता ...

class fake_module(object): 
    def __init__(self, name, *args): 
     self.name = name 
     self.__all__ = [] 
     all_objects = globals() 
     for name in args: 
      self.__dict__[name] = all_objects[name] 
      self.__all__.append(name) 
    def register(self): 
     sys.modules["%s.%s" % (__name__, self.name)] = self 

    fake_module('api', 'class1', 'class2', 'func3', 'exception4').register() 

फिर from mymodule import * के बजाय अन्य मॉड्यूल में आप के लिए क्या कर सकते हैं from mymodule.api import * जोड़ सकते हैं एक ही मॉड्यूल में सबकुछ रखते हुए बस वांछित सबसेट प्राप्त करें।

नोट: from ... import * आमतौर पर अच्छा अभ्यास नहीं है, और बड़ी सावधानी से और केवल मॉड्यूल/संकुल स्पष्ट रूप से राज्य है कि है कि वे मन में इस तरह के उपयोग के साथ डिजाइन किया गया है के साथ किया जाना चाहिए।

+0

यहां सभी पागल होने की कोई वास्तविक आवश्यकता नहीं है ... बस 'एपीआई' नामक एक अलग फ़ाइल बनाएं और इसमें फ़ंक्शंस का सबसेट आयात करें, और उसके बाद इसे मॉड्यूल के __init__.py में आयात करें। – Dave

+0

@ डेव: मॉड्यूल एकल फाइलें हैं, और ऐसे में '__init __। Py's नहीं है। संकुल वे हैं जिनके पास * __init __। py' फ़ाइल होनी चाहिए, और अन्य फाइलें भी हो सकती हैं। जिस लाइब्रेरी का मैं विकास कर रहा हूं वह एक फ़ाइल में आराम से फिट बैठता है (हाँ, मैंने इसके लिए पैकेज रूट की कोशिश की, और अंत में एक फ़ाइल/मॉड्यूल लेआउट पर वापस स्विच किया)। –

+0

पर्याप्त मेला। जब आप मानते हैं ...:) – Dave

2

मुझे नहीं लगता कि ऐसा करने का कोई तरीका है - कम से कम एक साफ तरीका नहीं। यहां तक ​​कि पायथन आधिकारिक मॉड्यूल में भी इसके दस्तावेज़ों में बहुत से उपयोग कार्य दिखाई देते हैं। अगर मैं अलग करता हूं, तो मैं क्या करूँगा, दो अलग-अलग मॉड्यूल बनाना है। वैसे भी, उपयोग करने के लिए from module import * एक अच्छा अभ्यास नहीं है और मैं तुम्हें यह करने के लिए, बहुत कम ऐसे अभ्यास :)

+0

उपयोगकर्ता द्वारा परिभाषित उपयोगिता मॉड्यूल के लिए यह बेहतर अभ्यास imho है। – Evpok

+0

@Evpok उपयोगकर्ता द्वारा परिभाषित उपयोगिता मॉड्यूल क्या है? क्या वे पाइथन कंसोल में इस्तेमाल किए जाने वाले मॉड्यूल हैं? – brandizzi

+0

मेरा मतलब है कि कुछ मॉड्यूल शॉर्टकट्स या स्थिरांक वाले अनुप्रयोगों, डिफ़ॉल्ट मानों, जादू संख्याओं, गंदे हैक्स के साथ हर जगह इस्तेमाल किए गए हैं ... – Evpok

0

आप नहीं हो सकता फिटिंग के लिए अपने मॉड्यूल डिजाइन करने के लिए आप क्या चाहते हैं की सिफारिश नहीं होगा: import * व्यवहार से परिभाषित किया गया है __all__

+0

बिल्कुल वही नहीं जो मैं चाहता हूं, लेकिन बहुत करीब है। 'mymodule.api आयात * से काफी अच्छा है। –

4

एथन, आपके fake_module संभवतः सादे पुरानी पायथन के साथ बेहतर ढंग से पूरा किया जा सकता है। बस एक निर्देशिका सेटअप में अपने कोड के लिए कदम:

mymodule 
    __init__.py 
    api.py 
    util.py 
    _mymodule.py 

कहाँ _mymodule.py अपने वर्तमान कोड है।

में अपने __init__.py:

from _mymodule import * 

आप में कर रहे हैं api.py

# explicity import only those api classes you want to expose 
# this will allow you to call `from mymodule.api import *` 
import from _mymodule ApiClass1 
import from _mymodule ApiClass2 
# etc 

तो अब आपके util.py

# explicity import only those util classes you want to expose 
# this will allow you to call `from mymodule.util import *` 
import from _mymodule UtilClass1 
import from _mymodule UtilClass2 
# etc 

लिए भी यही करें आप कर सकते हैं:

# import everything willy nilly for your help() 
from mymodule import * 

# or import only the "public" values from api and util 
from mymodule.api import * 
from mymodule.util import * 

इस तरह अपना कोड तोड़ना एक बड़े पैमाने पर मॉड्यूल को व्यवस्थित करने के लिए उपयोगी हो सकता है जिसे आप अभी भी शीर्ष स्तर के नामस्थान से एक्सेस करने में सक्षम होना चाहते हैं। लेकिन मुझे brandizzi से सहमत होना होगा कि इस मॉड्यूल का उपयोग करने वाले कोड में from mymodule import * का उपयोग करना आम तौर पर एक बुरा विचार है। उन आयातों का उपयोग कर रहे कोड की पारदर्शिता में आप खोने के आयात में आसानी से क्या हासिल करते हैं।

+0

पूर्ण, पूर्ण उत्तर जो सामान्य रूप से किए गए विवरण का विवरण देता है। –

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