मैं पाइथन एनम के प्रत्येक सदस्य के लिए इस तरह से दस्तावेज देना चाहता हूं कि आईपीथन इसे ढूंढ सके। मेरे पास अभी जो कुछ है वह कुछ ऐसा है:

class Color(Enum):
    """
    RED: The color red
    GREEN: The color green
    BLUE: The color blue. These docstrings are more useful in the real example
    """
    RED = 1
    GREEN = 2
    BLUE = 3

यह बहुत अच्छा नहीं है, क्योंकि यह सदस्य नामों को डुप्लिकेट करता है, और केवल एक सदस्य के लिए दस्तावेज़ मांगना कठिन बनाता है।

मुझे वह मिल सकता है जिसके बाद मैं हूं

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3
Color.RED.__doc__ = "The color red"
Color.GREEN.__doc__ = "The color green"
Color.BLUE.__doc__ = "The color blue. These docstrings are more useful in the real example"

लेकिन यह अभी भी नामों की पुनरावृत्ति से ग्रस्त है।

क्या ऐसा करने का कोई आसान तरीका है?

10
Eric 22 मई 2018, 21:06

2 जवाब

सबसे बढ़िया उत्तर

doc तर्क लेने के लिए आप Enum.__new__ को ओवरराइड कर सकते हैं:

class DocEnum(Enum):
    def __new__(cls, value, doc=None):
        self = object.__new__(cls)  # calling super().__new__(value) here would fail
        self._value_ = value
        if doc is not None:
            self.__doc__ = doc
        return self

जिसका उपयोग इस प्रकार किया जा सकता है:

class Color(DocEnum):
    """ Some colors """
    RED   = 1, "The color red"
    GREEN = 2, "The color green"
    BLUE  = 3, "The color blue. These docstrings are more useful in the real example"

जो IPython में निम्नलिखित देता है:

In [17]: Color.RED?
Type:            Color
String form:     Color.RED
Docstring:       The color red
Class docstring: Some colors

इसे IntEnum के लिए काम करने के लिए भी बनाया जा सकता है:

class DocIntEnum(IntEnum):
    def __new__(cls, value, doc=None):
        self = int.__new__(cls, value)  # calling super().__new__(value) here would fail
        self._value_ = value
        if doc is not None:
            self.__doc__ = doc
        return self
8
Ethan Furman 16 मई 2019, 21:45

@Eric ने इसे कैसे करें stdlib Enum का उपयोग करके दिखाया है; aenum1 का उपयोग करके इसे करने का तरीका इस प्रकार है:

from aenum import Enum  # or IntEnum


class Color(Enum):                     # or IntEnum

    _init_ = 'value __doc__'

    RED = 1, 'The color red'
    GREEN = 2, 'The color green'
    BLUE = 3, 'The color blue'

1 प्रकटीकरण: मैं Python stdlib Enum, enum34 बैकपोर्ट, और उन्नत गणना (aenum) लाइब्रेरी।

5
Ethan Furman 16 मई 2019, 17:26