我的类(dataclass
)有许多基于其他属性或dataclass
个字段计算的属性.
我正在try 创建一个decorator,它获取所需字段或属性的列表.这意味着他们不能是None
岁,也不能返回ValueError
岁.如果其中任何一个是None
,那么我想做点什么-为了简单起见,让我们raise ValueError(f'Missing {fieldname}')
.
def required_fields(required_fields):
def _required_fields(f):
def wrapper(self, *args, **kwargs):
for field in required_fields:
if getattr(self, field) is None:
raise ValueError(f"Missing {field}")
return f
return wrapper
return _required_fields
编辑-再次try
def required_fields(required_fields):
def _required_fields(f):
@functools.wraps(f)
def wrapper(self, *args, **kwargs):
for field in required_fields:
if getattr(self, field) is None:
raise ValueError(f"Missing {field}")
return f(self, *args, **kwargs)
return wrapper
Usage
@dataclasses.dataclass
class LoanCalculator:
_amount: typing.Optional[M] = None
_interest_rate: typing.Optional[M] = None
_years: typing.Optional[M] = None
_balance: typing.Optional[M] = None
_payment_day: typing.Optional[int] = None
_start_date: typing.Optional[datetime.date] = None
class MissingDataError(Exception):
pass
@required_fields(['_interest_rate'])
@property
def monthly_interest_rate(self):
return self._interest_rate / 12
我想在None
时得到ValueError(f'Missing _interest_rate')
,然后打monthly_interest_rate
.
问题是根本没有调用包装器,我不知道如何继续.你能给我一些提示吗?