如何防止开发人员使用get_tax()
函数与文字tax
参数,如get_tax(1000, 0.23)
,并强迫他们使用预定义的列表?
class TaxRates:
vat=0.23
pit=0.15
def get_tax(price, tax):
return price*tax
get_tax(1000, TaxRates.vat) # should succeed
get_tax(1000, 0.23) # should fail
或者有更好的方法来解决这个问题?
应该像下面这样工作,而不是将tax作为float传递给可以根据有效选项查找的字符串或常量。使用此方法,唯一有效的值是"vat"或";pit"
如果你想在结构体中保留以前的税,Enum也可以工作。
VAT = 'vat'
PIT = 'pit'
tax_rates = {
VAT: 0.23,
PIT: 0.15
}
def get_tax(price, tax):
try:
rate = tax_rates[tax]
except KeyError:
raise ValueError(f'Unknown tax "{tax}"')
return price * rate
get_tax(1000, VAT)
在编译时,将对函数的参数求值。因此,TaxRates.vat
被求值为0.23
,tax
最终得到"字面意思"。value0.23
。你不能这样检查。
一种解决方案是检查tax
传递的值是否是这些类属性之一(最好使用Enum
),否则引发错误。
import enum
class TaxRates(enum.Enum):
vat = 0.23
pit = 0.15
def get_tax(price, tax):
if tax not in [i.value for i in TaxRates]:
raise ValueError(f'tax parameter {tax} is not acceptable')
return price * tax
print(get_tax(1000, 0.23)) # Fine
print(get_tax(1000, 0.21)) # Error