Python开发HTTP框架时@http装饰器参数过多嵌套过深的优化咨询
解决方案(无需拆分装饰器,改动量极小)
下面几种方案可以独立使用也可以组合使用,均不需要大幅调整框架核心逻辑:
1. 提前抽离配置对象(零框架改动,仅优化用户侧写法)
将嵌套在装饰器内部的Argument、Document、Response实例提前赋值给变量,装饰器直接传入变量即可,完全消除嵌套层级:
# 提前定义接口参数列表 repeat_args = ( Argument("text", "string", maximum=32, doc=Document(title="Input text.")), Argument("count", "integer", minimum=1, maximum=100, doc=Document(title="Multiple count.")) ) # 提前定义接口文档配置 repeat_doc = Document( "Repeats the string specified with text.", types="application/json", responses=[ Response(200, "Successful response.", { "success": True, "result": "Hello, world!" }) ] ) # 装饰器写法极度简洁 @http("GET", args=repeat_args, require_auth=False, doc=repeat_doc) def get(request): pass
如果有多个接口复用参数或者响应结构,这种写法还能直接复用变量,减少重复代码。
2. 增加入参快捷映射(仅修改装饰器入参解析逻辑,无核心改动)
不需要拆分装饰器,只需要在@http装饰器、Argument类的入参解析层增加快捷参数兼容,自动构造内部的Document对象,用户侧不需要手动嵌套Document实例:
- 给
Argument类增加doc_title、doc_description等快捷参数,内部检测到传了这类参数时自动生成Document实例,同时保留原doc参数的兼容性 - 给
@http装饰器增加doc_summary、doc_types、doc_responses等顶级快捷参数,内部自动组装为Document实例,不需要用户手动传入doc=Document(...)
改造后的用户侧写法如下,完全消除了嵌套的Document构造:
@http( "GET", args=( Argument("text", "string", maximum=32, doc_title="Input text."), Argument("count", "integer", minimum=1, maximum=100, doc_title="Multiple count.") ), require_auth=False, doc_summary="Repeats the string specified with text.", doc_types="application/json", doc_responses=[ Response(200, "Successful response.", {"success": True, "result": "Hello, world!"}) ] ) def get(request): pass
3. 规范格式化缩进(零改动,仅优化可读性)
如果不想改任何框架逻辑也不想改写法,只需要统一调整装饰器的缩进规则,每个参数单独起行、同层级参数对齐,嵌套层级的视觉感知会大幅降低:
@http( "GET", args=( Argument( "text", "string", maximum=32, doc=Document(title="Input text.") ), Argument( "count", "integer", minimum=1, maximum=100, doc=Document(title="Multiple count.") ) ), require_auth=False, doc=Document( "Repeats the string specified with text.", types="application/json", responses=[ Response( 200, "Successful response.", {"success": True, "result": "Hello, world!"} ) ] ) ) def get(request): pass
内容的提问来源于stack exchange,提问作者Peyang
相关产品推荐
相关产品推荐

