Maybe a bit OT, but there are also holiday singletons defined in https://github.com/pydata/pandas/blob/master/pandas/tseries/holiday.py

class USFederalHolidayCalendar(AbstractHolidayCalendar):
    """
    US Federal Government Holiday Calendar based on rules specified by:
    https://www.opm.gov/policy-data-oversight/
       snow-dismissal-procedures/federal-holidays/
    """

class Holiday(object):
    """
    Class that defines a holiday with start/end dates and rules
    for observance.
    """

    def __init__(self, name, year=None, month=None, day=None, offset=None,
                 observance=None, start_date=None, end_date=None,
                 days_of_week=None):


On Jul 18, 2016 11:18 AM, "Ethan Furman" <ethan@stoneleaf.us> wrote:
There are currently a few locations in the stdlib, such as http and socket, that are now using
Enums to replace constants; those names are all upper-case -- those aren't the names I am
speaking of.

The names I am speaking of are those in brand-new enumerations where we have full control.

As an example:

class FederalHoliday(AutoNumberEnum):
    NewYear = "First day of the year.", 'absolute', JANUARY, 1
    MartinLutherKingJr = "Birth of Civil Rights leader.", 'relative', JANUARY, MONDAY, 3
    President = "Birth of George Washington", 'relative', FEBRUARY, MONDAY, 3
    Memorial = "Memory of fallen soldiers", 'relative', MAY, MONDAY, 5
    Independence = "Declaration of Independence", 'absolute', JULY, 4
    Labor = "American Labor Movement", 'relative', SEPTEMBER, MONDAY, 1
    Columbus = "Americas discovered", 'relative', OCTOBER, MONDAY, 2
    Veterans = "Recognition of Armed Forces service", 'relative', NOVEMBER, 11, 1
    Thanksgiving = "Day of Thanks", 'relative', NOVEMBER, THURSDAY, 4
    Christmas = "Birth of Jesus Christ", 'absolute', DECEMBER, 25

    def __init__(self, doc, type, month, day, occurance=None):
        self.__doc__ = doc
        self.type = type
        self.month = month
        self.day = day
        self.occurance = occurance

    def date(self, year):
        """
        returns the observed date of the holiday for `year`
        """"
        ...

    @classmethod
    def next_business_day(cls, date, days=1):
        """
        Return the next `days` business day from date.
        """
        ...
    @classmethod
    def count_business_days(cls, date1, date2):
        """
        Return the number of business days between 'date1' and 'date2'.
        """
        ...
    @classmethod
    def year(cls, year):
        """
        Return a list of the actual FederalHoliday dates for `year`.
        """
        ...
Take the name "NewYear":  if it had been a global constant I would have named it "NEWYEAR"; if
it had been a normal class attribute I would have named it "new_year"; however, being an Enum
member, it is neither of those things.

<context switch>
I've written some custom data types as part of my dbf package, and a few of them have instances
that are singletons that are created in the global (okay, module) namespace, and for them I
followed Python's lead in naming singletons:  Python has used Title Case in such things as None,
True, and False, so I followed suit and named mine -- Null, NullDate, NullTime, NullDateTime, etc.
</context switch>

Given my past history with using and creating singleton objects, I followed suit when creating
my own Enum classes.

I was recently queried about my apparent break with PEP 8 for naming Enum members, to which I
replied:

Considering the strange beast that an Enum is, there is not much precedent for it anywhere.

Consider:

- Enum is a class
-   but it is a container
-   and can be iterated over
-   and it has a length (which can be zero)
-   but it's always True in a boolean sense

- Enum members are instances of the Enum class
-   but are pre-created
-   and new ones cannot be created
-   but are available as attributes on the class

Given all that I have been using Title case (or CamelCase) to name the members as it helps
distinguish an Enum member from an ordinary attribute (which Enum classes can also have).

I forgot to include in that reply that I think CamelCase also helps to emphasize the special
singleton nature of Enum members.

My question for the community:  Your thoughts/opinions of my reasoning, and if you don't agree
then which casing choice would you recommend and use, and why?  (Reminder:  this question does
not include Enums whose names are replacements for existing constants and so the names cannot
be changed.)

--
~Ethan~
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/