强制开发人员使用预定义的属性列表作为函数参数



如何防止开发人员使用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

最新更新