Maison  >  Article  >  développement back-end  >  Explication détaillée des types d'énumération en Python (exemples de code)

Explication détaillée des types d'énumération en Python (exemples de code)

不言
不言avant
2018-12-11 10:15:093504parcourir

Cet article vous apporte une explication détaillée (exemple de code) des types d'énumération en Python. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Les types natifs de Python n’incluent pas les types d’énumération. Pour fournir une meilleure solution, Python a ajouté la bibliothèque standard enum dans la version 3.4 via PEP 435.

Le type d'énumération peut être considéré comme une étiquette ou une collection de constantes, généralement utilisées pour représenter certaines collections limitées, telles que les jours de la semaine, les mois, le statut, etc. Que faisons-nous lorsqu'il n'y a pas de type d'énumération spécialement fourni ? Généralement, il est implémenté via un dictionnaire ou une classe :

Color = {
    'RED'  : 1,
    'GREEN': 2,
    'BLUE' : 3,
}
class Color:
    RED   = 1
    GREEN = 2
    BLUE  = 3

Cette façon d'implémenter l'énumération ne pose bien sûr aucun problème si elle est utilisée avec précaution. tout, c'est une solution de compromis. Le danger est qu'il puisse être modifié.

Utiliser Enum

Une meilleure façon est d'utiliser le type Enum fourni par la bibliothèque standard. La bibliothèque officielle est digne de confiance. Les versions antérieures à 3.4 peuvent également télécharger les bibliothèques prises en charge via pip install enum. Exemple simple :

from enum import Enum
class Color(Enum):
    red = 1
    green = 2
    blue = 3

Les membres de l'énumération ont des valeurs (répétables par défaut), les membres de l'énumération ont des représentations sous forme de chaîne conviviales :

>>> print(Color.red)
Color.red
>>> print(repr(Color.red))
<Color.red: 1>
>>> type(Color.red)
<Enum &#39;Color&#39;>
>>> isinstance(Color.green, Color)
True

Les types d'énumération ne sont pas instanciables, ne peuvent pas être modifiés.

Définir une énumération

Lors de la définition d'une énumération, les noms des membres ne peuvent pas être répétés

class Color(Enum):
    red = 1
    green = 2
    red = 3    # TypeError: Attempted to reuse key: 'red'

Valeurs des membres sont autorisés à être les mêmes, deuxième Les noms de chaque membre sont considérés comme des alias du premier membre

class Color(Enum):
    red   = 1
    green = 2
    blue  = 1

print(Color.red)              # Color.red
print(Color.blue)             # Color.red
print(Color.red is Color.blue)# True
print(Color(1))               # Color.red  在通过值获取枚举成员时,只能获取到第一个成员

Si vous ne pouvez pas définir la même valeur de membre, vous pouvez la décorer avec unique

from enum import Enum, unique
@unique
class Color(Enum):
    red   = 1
    green = 2
    blue  = 1  # ValueError: duplicate values found in <enum &#39;Color&#39;>: blue -> red

Valeur d'énumération

Vous pouvez obtenir des membres par nom de membre ou par valeur de membre :

print(Color['red'])  # Color.red  通过成员名来获取成员

print(Color(1))      # Color.red  通过成员值来获取成员

Chaque membre a a name Attributs et attributs de valeur :

member = Color.red
print(member.name)   # red
print(member.value)  # 1

prend en charge le parcours itératif des membres dans l'ordre défini. S'il y a des membres avec des valeurs en double, seul le premier membre en double est obtenu :

for color in Color:
    print(color)
L'attribut spécial

est un dictionnaire ordonné mappant les noms aux membres, qui peuvent également être parcourus : __members__

for color in Color.__members__.items():
    print(color)          # ('red', <Color.red: 1>)

Comparaison d'énumération

Les membres d'une énumération peuvent être comparé pour l'identité via

ou pour l'équivalence via is : ==

Color.red is Color.red
Color.red is not Color.blue

Color.blue == Color.red
Color.blue != Color.red
Les membres d'une énumération ne peuvent pas être comparés pour la taille :

Color.red < Color.blue    # TypeError: unorderable types: Color() < Color()

Énumération étendue IntEnum

IntEnum est une extension d'Enum Différents types d'énumérations entières peuvent également être comparés entre eux :

from enum import IntEnum
class Shape(IntEnum):
    circle = 1
    square = 2

class Request(IntEnum):
    post = 1
    get = 2

print(Shape.circle == 1)            # True
print(Shape.circle < 3)             # True
print(Shape.circle == Request.post) # True
print(Shape.circle >= Request.post) # True

RésuméLa fonction du module enum est très claire et son utilisation est simple. Sa méthode d'implémentation mérite également d'être apprise. Si vous en avez l'occasion, vous pouvez jeter un œil à son code source.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer