2014-12-19 12 views
6

मैं एक लाइब्रेरी बना रहा हूं जो पाइथन मॉड्यूल से संबंधित है। विवरण प्राप्त किए बिना, मुझे सामान्य पायथन मॉड्यूल एक्सटेंशन की एक सूची चाहिए।क्या सभी सामान्य मॉड्यूल एक्सटेंशन प्राप्त करने का कोई आसान तरीका है?

जाहिर है, मैं .py चाहते हैं, लेकिन मैं भी लोगों को इस तरह के .pyw, .pyd, दूसरे शब्दों में आदि के रूप में, मैं कुछ भी है कि आप आयात कर सकते हैं चाहते हैं शामिल करना चाहते हैं।

क्या मानक पुस्तकालय में कोई उपकरण है जो इस सूची को मेरे लिए बना देगा? या क्या मुझे इसे स्वयं बनाना है (और सभी मानों को हार्डकोड करें)?

extensions = ['.py', '.pyw', ...] 

उत्तर

7

यह कार्यक्षमता importlib.machinery module में पाई जा सकती है।

>>> set(importlib.machinery.SOURCE_SUFFIXES + 
...  importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES + 
...  importlib.machinery.EXTENSION_SUFFIXES + 
...  importlib.machinery.DEBUG_BYTECODE_SUFFIXES) 
{'.pyw', '.py', '.pyd', '.pyc', '.pyo'} 
>>> 

आप हो सकता है:

>>> import importlib 
>>> importlib.machinery.SOURCE_SUFFIXES 
['.py', '.pyw'] 
>>> importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES 
['.pyo'] 
>>> importlib.machinery.EXTENSION_SUFFIXES 
['.pyd'] 
>>> importlib.machinery.DEBUG_BYTECODE_SUFFIXES 
['.pyc'] 
>>> 

तो, आप बहुत आसानी से एक वैश्विक सेट में इन शामिल हो सकते हैं: अंदर, वहाँ कई स्थिरांक जो विभिन्न पायथन मॉड्यूल एक्सटेंशन से संबंधित हैं all_suffixes function में रुचि रखते हैं:

>>> importlib.machinery.all_suffixes() 
['.py', '.pyw', '.pyc', '.pyd'] 
>>> 

नोट हालांकि यह फ़ंक्शन .pyo के साथ प्रतिस्थापित करेगा यदि पाइथन -O or -OO options के साथ लॉन्च किया गया है। इससे बचने के लिए आप कर सकते हैं:

>>> set(importlib.machinery.all_suffixes() + 
...  importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES + 
...  importlib.machinery.DEBUG_BYTECODE_SUFFIXES) 
{'.pyw', '.py', '.pyd', '.pyc', '.pyo'} 
>>> 

यह है कि .pyc और .pyo दोनों सेट में हैं सुनिश्चित करेगा।


अंत में, आप importlib.machinery.BYTECODE_SUFFIXES से सावधान रहना चाहिए। जैसा कि @MartijnPieters ने टिप्पणियों में उल्लेख किया है, यह हमेशा OPTIMIZED_BYTECODE_SUFFIXES या DEBUG_BYTECODE_SUFFIXES के बराबर होगा। इसका अर्थ यह है कि यदि आप इसे संग्रह में जोड़ते हैं, तो आपको या तो डुप्लीकेट .pyc या एक डुप्लिकेट .pyo मान मिलेगा (जब तक कि आप निश्चित रूप से सेट का उपयोग नहीं करते)।

docs से

:

importlib.machinery.BYTECODE_SUFFIXES

बाईटकोड मॉड्यूल के लिए मान्यता प्राप्त फ़ाइल प्रत्यय का प्रतिनिधित्व तार की एक सूची। __debug__ पर आधारित या OPTIMIZED_BYTECODE_SUFFIXES पर सेट करें या नहीं।

मैं इस हालांकि निरंतर का उपयोग कर, क्योंकि मैं दोनों OPTIMIZED_BYTECODE_SUFFIXES और संग्रह में DEBUG_BYTECODE_SUFFIXES चाहते परेशान नहीं किया। तो, इसे जोड़ने का कोई कारण नहीं है।


मैं एक सेट का उपयोग करने के लिए है क्योंकि वे सूचियों की तुलना में एक तेजी से देखने के लिए समय का निर्णय लिया। मतलब, वे मूल्यों के वैश्विक संग्रह के लिए बेहतर अनुकूल हैं जो बदले नहीं जाएंगे और जिनके लिए कोई विशेष आदेश की आवश्यकता नहीं है। इसके अतिरिक्त, वे यह सुनिश्चित करेंगे कि हम आकस्मिक रूप से संग्रह में डुप्लिकेट एक्सटेंशन नहीं जोड़ते हैं।

+1

ध्यान दें कि 'all_suffixes()' में * एक्सटेंशन मॉड्यूल * भी शामिल है; मैक पर यह '[' .py ',' .pyc ',' .cpython-34m.so ',' .abi3.so ',' .so ']' उदाहरण के लिए देता है। –

+0

इसके अलावा, 'importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES' या 'importlib.machinery.DEBUG_BYTECODE_SUFFIXES' संलग्न करें, जो कि * importlib.machinery.BYTECODE_SUFFIXES' के बराबर * नहीं है। अन्यथा '-O' या' -OO' के साथ चलते समय आपके पास '.pyo * * दो बार होगा। –

+0

हां, एक सेट अभी भी बेहतर होगा। ['Importlib.machinery.BYTECODE_SUFFIXES'] देखें (https: // docs.python.org/3/लाइब्रेरी/importlib.html # importlib.machinery.BYTECODE_SUFFIXES') प्रलेखन: * या तो' DEBUG_BYTECODE_SUFFIXES' या 'OPTIMIZED_BYTECODE_SUFFIXES' पर सेट करें इस पर आधारित है कि '__debug__' सत्य है या नहीं। * –

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

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