-->

When are python sunder names used?

2019-04-20 04:53发布

问题:

In Python, there are conventions for single leading underscore, double leading underscore, double leading + double trailing underscore, and single trailing underscore. Many of those are outlined in the answers at What is the meaning of a single- and a double-underscore before an object name?.

But what is the meaning or convention for single leading + single trailing underscore? I've first seen their use in the enum module:

8.13.15.3.2. Supported _sunder_ names

  • _name_ – name of the member
  • _value_ – value of the member; can be set / modified in new
  • _missing_ – a lookup function used when a value is not found; may be overridden
  • _ignore_ – a list of names, either as a list() or a str(), that will not be transformed into members, and will be removed from the final class
  • _order_ – used in Python 2/3 code to ensure member order is consistent (class attribute, removed during class creation)
  • _generate_next_value_ – used by the Functional API and by auto to get an appropriate value for an enum member; may be overridden

I have not seen such single-leading-single-trailing underscore sunder names before. Are they treated in any special way, or otherwise have an implied meaning that is distinct from any of the other underscore-related naming conventions? How are they different from having no underscores at all?

回答1:

They are not treated in any special way. They are being used by the enum module so as to

  • Not to be accidentally overridden

e.g.

class Status(Enum):
    alive = auto()
    dead = auto()
    missing = auto()

You can see that Status.missing and Status._missing_ are different objects. If _sunder_ names, were allowed, we could accidentally override the _missing_ function which would cause unexpected errors.

  • not appear as private. The name _value in python is considered private. To express that these are not private (which again, a user might want an enum value to be private), they are instead given sunder names

  • other alternatives such as __double_leading_underscore and __dunder__ also have special meanings in python as you stated above. _sunder_ methods in Enum act something like the _dunder_ protocols of pure python, but aren't reserved by the language.

Basically, it's an option to avoid attribute name conflicts without giving the wrong impression.