declarative.py 文件源码

python
阅读 13 收藏 0 点赞 0 评论 0

项目:noscrapy 作者: hwms 项目源码 文件源码
def __new__(cls, name, bases, classdict):
        self = super().__new__(cls, name, bases, dict(classdict))

        attrs_lists = [getattr(b, '__attrs__', ()) for b in bases]
        attrs_lists += [[a for a in classdict if not a.startswith('__')]]
        # use ordered dict like an ordered set
        self.__attrs__ = tuple(OrderedDict.fromkeys(chain.from_iterable(attrs_lists)))

        base_fields = {}
        for base in bases:
            for attr in getattr(base, '__fields__', ()):
                if attr not in base_fields:
                    base_fields[attr] = getattr(base, attr).clone(self)
        fields = {}
        for attr, value in list(classdict.items()):
            if attr.startswith('__'):
                continue
            if isinstance(value, Field):
                fields[attr] = value._setup(self, attr, base=base_fields.get(attr, NOTSET))
            elif attr in base_fields:
                fields[attr] = base_fields[attr].clone(self, default=value)

        for attr, base_field in base_fields.items():
            if attr not in fields:
                fields[attr] = base_field.clone(self)

        for attr, field in fields.items():
            for prop_name in ('fget', 'fset', 'fdel'):
                prop_value = getattr(field, prop_name)
                if isinstance(prop_value, FunctionType):
                    prop_value = prop_value.__name__
                if isinstance(prop_value, str):
                    prop_value = getattr(self, prop_value)
                    setattr(field, prop_name, prop_value)
            setattr(self, attr, field)

        self.__fields__ = tuple(a for a in self.__attrs__ if a in fields)
        return self
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号