You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 22:20:32