Wie definiere ich einen Aliaswert für ein Enum-Mitglied?Python

Python-Programme
Anonymous
 Wie definiere ich einen Aliaswert für ein Enum-Mitglied?

Post by Anonymous »

In Python trägt ein Enum-Mitglied einen zugrunde liegenden Wert, der durch Lesen des Attributs value abgerufen werden kann. Umgekehrt kann ein Enum-Mitglied aus seinem Wert erhalten werden, indem der Enum-Typ aufgerufen wird.

Code: Select all

class Food(enum.Enum):
MEAT  = 'meat'
DAIRY = 'dairy'

print(Food.MEAT.value)              # 'meat'
print(Food('meat') is Food.MEAT)    # True
Ich möchte, dass es möglich ist, dasselbe Enum-Mitglied durch Übergabe mehrerer unterschiedlicher Werte zu erhalten. Offensichtlich wäre nur einer davon kanonisch und über das Attribut value erhältlich. Ich kann es so machen:

Code: Select all

class Food(enum.Enum):
MEAT  = 'meat'
DAIRY = 'dairy'

@classmethod
def from_str(cls, item):
match item:
case 'spam'|'ham':
return cls.MEAT
case 'eggs'|'milk':
return cls.DAIRY
return cls(item)
und denken Sie dann daran, weiterhin Food.from_str(s) anstelle von Food(s) zu verwenden. Dies ist praktikabel, obwohl ich die Aliase lieber in der Definition des Mitglieds haben würde, anstatt Mitglieder in einer Hilfsmethode zu wiederholen (wie in meiner anderen Frage zu Python-Aufzählungen). Es gibt aber auch andere Probleme damit:

Code: Select all

#!/usr/bin/env python3
import argparse
import enum

class Food(enum.Enum):
MEAT  = 'meat'
DAIRY = 'dairy'

@classmethod
def from_str(cls, item):
match item:
case 'spam'|'ham':
return cls.MEAT
case 'eggs'|'milk':
return cls.DAIRY
return cls(item)

parser = argparse.ArgumentParser()
parser.add_argument('food', type=Food.from_str)
args = parser.parse_args()

print(args.food)
Wenn ich dieses Skript mit „bread“ als Befehlszeilenargument aufrufe, beschwert sich argparse über einen „ungültigen from_str-Wert“. Daher würde ich lieber type=Food als add_argument-Argument verwenden, damit der Typ in der Fehlermeldung korrekt identifiziert wird.
Wie kann das gelöst werden?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post