2017-10-30 27 views
5

चलो कहते हैं कि मैं निम्नलिखित enum करते हैं?क्या पाइथन 3 में सीधे एक enum फ़ील्ड आयात करना संभव है? किसी भी तरह सीधे इस enum से खेतों आयात करने के लिए</p> <pre><code>class LineStyle(Enum): SOLID = 'solid' DASHED = 'dashed' DASHDOT = 'dashdot' DOTTED = 'dotted' </code></pre> <p>क्या यह संभव है:

उदाहरण के लिए:

class LineStyle(Enum): 
    SOLID = 'solid' 
    DASHED = 'dashed' 
    DASHDOT = 'dashdot' 
    DOTTED = 'dotted' 

SOLID = LineStyle.SOLID 
DASHED = LineStyle.DASHED 
DASHDOT = LineStyle.DASHDOT 
DOTTED = LineStyle.DOTTED 

वहाँ यह करने के लिए एक और अधिक सुरुचिपूर्ण रास्ता नहीं है:

from mymodule.LineStyle import SOLID, DASHED # does not work 

केवल वैकल्पिक हल मैं के बारे में सोच सकता है मॉड्यूल चर के रूप में सभी enums क्षेत्रों की घोषणा की जाती है?

+0

आयात तंत्र कक्षाओं में वस्तुओं तक पहुंच नहीं प्राप्त करता है। तो, नहीं। –

+0

मई मैं पूछ सकता हूं कि आप उन्हें 'LineStyle.SOLID' क्यों नहीं उपयोग कर सकते हैं? इसके लिए आपको एक अलग चर की आवश्यकता क्यों है? – Andrey

+2

यह सिर्फ कॉस्मेटिक कारणों/कोड संयोजन के लिए है। 'Plot_some_stuff (color =some_stuff (color = rED, line_style = DOTTED) 'की जगह' plot_some_stuff (color = color.RED, line_style = LineStyle.DOTTED) जैसी सामग्री रखने में अनावश्यक है। – nicoulaj

उत्तर

6

संख्या import के साथ ही मॉड्यूल ऑब्जेक्ट को इंगित करने वाले मॉड्यूल ऑब्जेक्ट को इंगित करने वाले वर्तमान नामस्थान में केवल संदर्भ जोड़ सकता है या मॉड्यूल में शीर्ष-स्तरीय नामों में। मॉड्यूल में एनम मान शीर्ष-स्तरीय नाम नहीं हैं जबतक कि आप उन्हें स्पष्ट रूप से वहां नहीं डालते, जैसे आपके कामकाज में।

आप कर सकते हैं स्वचालित वैश्विक करने के लिए उन का नाम निर्धारित करने, अपने मॉड्यूल वैश्विक को __members__ attribute से सभी जानकारी जोड़कर:

globals().update(LineStyle.__members__) 

globals() function आप वर्तमान मॉड्यूल के नाम स्थान के लिए एक संदर्भ देता है, आपको यह बताने गतिशील रूप से उस नामस्थान में नाम जोड़ें। LineStyle.__members__ विशेषता (aliases सहित) मूल्य के लिए नाम की आ मानचित्रण है, इसलिए ऊपर ग्लोबल नेम स्पेस के लिए सभी के नाम जोड़ता है:

>>> from enum import Enum 
>>> class LineStyle(Enum): 
...  SOLID = 'solid' 
...  DASHED = 'dashed' 
...  DASHDOT = 'dashdot' 
...  DOTTED = 'dotted' 
... 
>>> SOLID 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'SOLID' is not defined 
>>> globals().update(LineStyle.__members__) 
>>> SOLID 
<LineStyle.SOLID: 'solid'> 

आप उपनाम में शामिल नहीं करना चाहते हैं, एक for पाश का उपयोग करें, पुनरावृत्ति LineStyle ऑब्जेक्ट पर। यह केवल आपको सदस्य ऑब्जेक्ट देता है, जिससे आप नाम खींच सकते हैं:

for member in LineStyle: 
    globals()[member.name] = member 
+0

क्षेत्रों को गतिशील रूप से थोड़े से मेरे लिए पहली जगह में एम्स का उपयोग करने के उद्देश्य को हरा देता है, जो "छद्म मजबूत टाइपिंग"/आईडीई अनुकूल कोड है, इसलिए मुझे लगता है कि मैं बस अपने कामकाज के साथ रहूंगा ... वैसे भी धन्यवाद। – nicoulaj

+0

@nicoulaj: निश्चित रूप से, लेकिन फिर खुद को दोहराने की कीमत का भुगतान करें। व्यक्तिगत रूप से, मैं ग्लोबल्स बिल्कुल नहीं बनाऊंगा। –

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