Python中函数内类的导入与调用问题求助
解决方案一:拆分基类与动态子类
将通用分页字段定义在模块级基类中,在函数内动态生成包含data字段的子类,既支持外部导入基类,又保留原函数的动态生成逻辑。
修改api/schemas.py代码:
from marshmallow import ma # 全局缓存 paginated_schema_cache2 = {} # 模块级基类,包含通用分页字段 class PaginatedSchema2(ma.Schema): class Meta: ordered = True total = ma.Integer(dump_only=True) current_page = ma.Integer() count = ma.Integer(dump_only=True) last_page = ma.Integer(dump_only=True) firstItem = ma.Integer(dump_only=True) lastItem = ma.Integer(dump_only=True) per_page = ma.Integer() first_page_url = ma.String(dump_only=True) last_page_url = ma.String(dump_only=True) next_page_url = ma.String(dump_only=True) prev_page_url = ma.String(dump_only=True) def PaginatedCollection2(schema): if schema in paginated_schema_cache2: return paginated_schema_cache2[schema] # 动态生成子类,添加与传入schema绑定的data字段 class DynamicPaginatedSchema(PaginatedSchema2): data = ma.Nested(schema, many=True) DynamicPaginatedSchema.__name__ = 'Paginated{}'.format(schema.__class__.__name__) paginated_schema_cache2[schema] = DynamicPaginatedSchema return DynamicPaginatedSchema
在目标文件中使用:
现在可以正常导入PaginatedSchema2,同时PaginatedCollection2函数仍能生成带data字段的响应schema:
from api.schemas import StringPaginationSchema, PaginatedCollection, EmptySchema, PaginatedCollection2, PaginatedSchema2 # ... 其他代码保持不变 ... # 用PaginatedSchema2验证请求参数,response用动态生成的子类 return arguments(PaginatedSchema2)(response(PaginatedCollection2(schema))(paginate))
解决方案二:单独定义请求分页Schema
如果仅需要用PaginatedSchema2验证请求参数(仅需current_page、per_page等输入字段),可拆分出专门的请求Schema,明确区分请求验证与响应序列化的逻辑:
修改api/schemas.py代码:
from marshmallow import ma paginated_schema_cache2 = {} # 专门用于请求参数验证的分页Schema class PaginatedRequestSchema(ma.Schema): current_page = ma.Integer(missing=0) per_page = ma.Integer(missing=25) after = ma.String(allow_none=True) url = ma.String(allow_none=True) # 原动态响应Schema生成逻辑不变 def PaginatedCollection2(schema): if schema in paginated_schema_cache2: return paginated_schema_cache2[schema] class PaginatedSchema2(ma.Schema): class Meta: ordered = True data = ma.Nested(schema, many=True) total = ma.Integer(dump_only=True) current_page = ma.Integer() count = ma.Integer(dump_only=True) last_page = ma.Integer(dump_only=True) firstItem = ma.Integer(dump_only=True) lastItem = ma.Integer(dump_only=True) per_page = ma.Integer() first_page_url = ma.String(dump_only=True) last_page_url = ma.String(dump_only=True) next_page_url = ma.String(dump_only=True) prev_page_url = ma.String(dump_only=True) PaginatedSchema2.__name__ = 'Paginated{}'.format(schema.__class__.__name__) paginated_schema_cache2[schema] = PaginatedSchema2 return PaginatedSchema2
在目标文件中使用:
from api.schemas import StringPaginationSchema, PaginatedCollection, EmptySchema, PaginatedCollection2, PaginatedRequestSchema # ... 其他代码保持不变 ... # 使用专门的请求Schema验证参数 return arguments(PaginatedRequestSchema)(response(PaginatedCollection2(schema))(paginate))
内容的提问来源于stack exchange,提问作者rockets4all
相关产品推荐
相关产品推荐

