from abc import ABC,abstractmethod
class Validator(ABC):
def __set_name__(self, owner, name):
self.private_name = '_' + name
def __get__(self, instance, owner):
return getattr(instance,self.private_name)
def __set__(self, instance, value):
self.validate(value)
setattr(instance,self.private_name,value)
@abstractmethod
def validate(self, value):
pass
class OneOf(Validator):
def __init__(self, *options):
self.options = set(options)
def validate(self, value):
if value not in self.options:
raise ValueError(f'Expected {value!r} to be one of {self.options!r}')
class Number(Validator):
def __init__(self, minvalue=None,maxvalue=None):
self.minvalue = minvalue
self.maxvalue = maxvalue
def validate(self, value):
if not isinstance(value,(int,float)):
raise TypeError(f'Expected {value!r} to be an int ro float')
if self.minvalue is not None and value < self.minvalue:
raise ValueError(f'Expected {value!r} to be at least {self.minvalue!r}')
if self.maxvalue is not None and value > self.maxvalue:
raise ValueError(f'Expected {value!r} to be no more than {self.maxvalue!r}')
class String(Validator):
def __init__(self,minsize=None,maxsize=None,predicate=None):
self.minsize = minsize
self.maxsize = maxsize
self.predicate = predicate
def validate(self, value):
if not isinstance(value,str):
raise TypeError(f'Expected {value!r} to be an str')
if self.minsize is not None and len(value) < self.minsize:
raise ValueError(f'Expected {value!r} to be no smaller than {self.minsize!r}')
if self.maxsize is not None and len(value) > self.maxsize:
raise ValueError(f'Expected {value!r} to be no bigger than {self.maxsize!r}')
if self.predicate is not None and not self.predicate(value):
raise ValueError(f'Expected {self.predicate} to be true for {value!r}')
class Component:
name = String(minsize=3,maxsize=10,predicate=str.isupper)
kind = OneOf('wood','metal','plastic')
quantity = Number(minvalue=0)
def __init__(self,name,kind,quantity):
self.name = name
self.kind = kind
self.quantity = quantity
Component = Component("SCSC",'metal',5)
python自定义验证器
最新推荐文章于 2024-07-18 15:53:23 发布