一些数据值使用str
或int
之类的基本类型,
但是并非所有的str和int都是该数据值的有效值。
枚举只能将可能性限制在一组定义的值集中。
例子:
血型是弦,但只有一组8个有效字符串。
不存在称为'randombloodtype'
的血液,但'AB-'
有效。
from enum import Enum
class BloodType(str, Enum):
A_negative = "A-"
B_negative = "B-"
AB_negative = "AB-"
O_negative = "O-"
A_positive = "A+"
B_positive = "B+"
AB_positive = "AB+"
O_positive = "O+"
assert "A-" in list(BloodType)
assert "O+" == BloodType.O_positive
那么,为什么不使用列表呢?
以下代码与以上相同:
BLOOD_TYPE = [
"A-",
"B-",
"AB-",
"O-",
"A+",
"B+",
"AB+",
"O+",
]
assert "A-" in BLOOD_TYPE
,但让我们假设我们应该制作一个新的代码。鉴于供体血型,返回允许的接受者列表。
from typing import List
def blood_type_can_donate_to(donor: str) -> List[str]:
_recipients = {
"A-": ["A-", "AB-", "A+", "AB+"],
"B-": ["B-", "AB-", "B+", "AB+"],
"AB-": ["AB-", "AB+"],
"O-": ["A-","B-", "AB-", "O-", "A+", "B+", "AB+", "0+"],
"A+": ["A+", "AB+"],
"B+": ["B+", "AB+"],
"AB+": ["AB+"],
"O+": ["A+", "B+", "AB+", "O+"]
}
return _recipients[donor]
并使用枚举:
from enum import Enum
from typing import List
class BloodType(str, Enum):
A_negative = "A-"
B_negative = "B-"
AB_negative = "AB-"
O_negative = "O-"
A_positive = "A+"
B_positive = "B+"
AB_positive = "AB+"
O_positive = "O+"
def blood_type_can_donate_to(donor: BloodType) -> List[BloodType]:
if donor == BloodType.A_negative:
return [
BloodType.A_negative,
BloodType.AB_negative,
BloodType.A_positive,
BloodType.AB_positive
]
elif donor == BloodType.B_negative:
return [
BloodType.B_negative,
BloodType.AB_negative,
BloodType.B_positive,
BloodType.AB_positive
]
elif donor == BloodType.AB_negative:
return [
BloodType.AB_negative,
BloodType.AB_positive
]
elif donor == BloodType.O_negative:
return list(BloodType)
elif donor == BloodType.A_positive:
return [
BloodType.A_positive,
BloodType.AB_positive
]
elif donor == BloodType.B_positive:
return [
BloodType.B_positive,
BloodType.AB_positive
]
elif donor == BloodType.AB_positive:
return [
BloodType.AB_positive
]
elif donor == BloodType.O_positive:
return [
BloodType.A_positive,
BloodType.B_positive,
BloodType.AB_positive,
BloodType.O_positive
]
第二个与第一个的作用完全相同,但具有一些很大的优势:
- 帮助您避免错误。
- 如果您犯了一个错误,请帮助编码编辑器以警告。
- 帮助下一个人在代码中工作,避免错误。
再次查看第一个版本:它具有错别字错误,一个0而不是o。