
在Python开发中,我们经常需要定义具有层次结构的字符串常量,例如HTTP API的端点路径、配置项路径或文件系统路径。理想情况下,我们希望能够通过直观的点分表示法(如`Endpoints.CONFIGURATION.ACTIVE`)来访问这些常量,并且当访问任何一个层级时,都能自动构建出完整的路径字符串(如`/configuration/active`)。传统的方法,如简单的嵌套类或字典,往往难以同时满足点分访问、自动路径构建以及IDE自动补全的需求。
为了解决上述挑战,我们可以设计一个自定义的Endpoint类。这个类将通过内部维护父子关系,并巧妙地利用Python的魔术方法,实现所需的功能。
Endpoint类通过以下关键属性和方法来管理层次结构和字符串构建:
from collections.abc import Iterable
class Endpoint:
def __init__(self, name: str) -> None:
self._name = name
self._children = {}
self._parent = None__dir__(self) -> Iterable[str]: 这个方法允许我们自定义dir()函数或IDE自动补全时返回的属性列表。通过将子端点的名称添加到默认属性列表中,我们使得点分访问时可以提示子端点。
def __dir__(self) -> Iterable[str]:
cls_attrs = object.__dir__(self)
return [n for n in self._children] + cls_attrs__repr__(self) -> str: 提供一个清晰的、对开发者友好的对象表示,通常用于调试。
def __repr__(self) -> str:
return f'<Endpoint({self._name!r})>'__str__(self) -> str: 这是实现路径自动构建的核心。当Endpoint实例被转换为字符串时,它会递归地调用其父端点的__str__方法,并将其结果与当前端点的名称拼接起来,从而构建出完整的层次化路径。如果存在父节点,路径会以/分隔。
def __str__(self) -> str: if self._parent: up = f'{str(self._parent)}/' else: up = '' return f'{up}{self._name.lower()}'
注意:这里将_name转换为小写,以符合常见的URL路径规范。
美图云修
商业级AI影像处理工具
50
查看详情
__getattr__(self, _attr: str): 当尝试访问一个不存在的属性时,Python会调用此方法。我们利用它来检查请求的属性名是否存在于_children字典中。如果存在,则返回对应的子Endpoint实例,从而实现点分访问。
def __getattr__(self, _attr: str):
if _attr in self._children:
return self._children[_attr]
return object.__getattribute__(self, _attr)为了方便地构建层次结构,我们提供了append_endpoint方法和__iadd__(in-place add)魔术方法。
append_endpoint(self, endpoint_name: str): 这是一个内部方法,用于创建并添加一个新的子Endpoint实例。它会检查子端点名称是否重复,并设置新子端点的_parent引用为当前实例。
def append_endpoint(self, endpoint_name: str):
if any(c.lower()==endpoint_name.lower() for c in self._children): # 增加大小写不敏感的检查
raise KeyError(f'A sub-endpoint {endpoint_name!r} already exists.')
new_endpoint = self.__class__(endpoint_name)
new_endpoint._parent = self
self._children[endpoint_name] = new_endpoint__iadd__(self, endpoint_name: str): 这个方法使得我们可以使用+=运算符来添加子端点,语法更加简洁直观。
def __iadd__(self, endpoint_name: str):
if not isinstance(endpoint_name, str):
return NotImplemented
self.append_endpoint(endpoint_name)
return self现在,我们来看看如何使用这个Endpoint类来构建和访问层次化常量:
# 创建根端点
config = Endpoint('CONFIGURATION')
# 使用 += 运算符添加子端点
config += 'ACTIVE' # 'ACTIVE' 将出现在点分补全中
config.ACTIVE += 'LAST' # 进一步嵌套
config += 'INACTIVE'
config.INACTIVE += 'HISTORY'
config.INACTIVE.HISTORY += 'Y2025'
config.INACTIVE.HISTORY += 'Y2025'
config.INACTIVE.HISTORY += 'Y2025'
config.INACTIVE.HISTORY += 'Y2025'
# 访问并获取完整的路径字符串
print(str(config))
# 输出: 'configuration'
print(str(config.ACTIVE))
# 输出: 'configuration/active'
print(str(config.ACTIVE.LAST))
# 输出: 'configuration/active/last'
print(str(config.INACTIVE.HISTORY.Y2025))
# 输出: 'configuration/inactive/history/y2025'通过构建自定义的Endpoint类,我们成功地实现了一种优雅且强大的方式来管理Python中的层次化字符串常量。这种方法不仅支持直观的点分表示法访问和IDE自动补全,还能够根据层级自动构建出完整的路径字符串。它提供了一种高度可读和可维护的解决方案,特别适用于定义API端点、配置路径或任何需要结构化字符串常量的场景,显著提升了开发效率和代码质量。
以上就是Python中实现层次化点分字符串常量与路径自动构建的详细内容,更多请关注其它相关文章!
相关文章:
优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率
Windows 11怎么彻底关闭定位_Windows 11服务中禁用Geolocation
C++ explicit关键字防止隐式转换_C++构造函数安全规范
Python getattr() 异常处理深度解析:避免程序意外退出
响应式CSS Grid布局:优化网格项在小屏幕下的堆叠与宽度适配
现代化 SciPy 一维插值:interp1d 的替代方案与最佳实践
荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程
Yandex官网搜索引擎免登录_俄罗斯Yandex一键直达入口
初次安装JDK时环境变量如何正确配置_J*A_HOME与PATH设置规则讲解
怎么在html里运行vbs脚本_html中运行vbs脚本方法【教程】
Golang如何使用context实现超时取消_Golang context超时取消模式实践
Win11如何使用Windows Sandbox Win11沙盒功能开启与使用教程【详解】
印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】
12306选座系统怎么选连座_12306选座多人连坐操作方法
谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问
Excel中VLOOKUP的第四个参数是干什么用的_Excel VLOOKUP第四参数作用解析
Vue.js 图片显示异常排查:理解应用挂载范围与DOM ID唯一性
c++如何使用chrono库处理时间_c++标准库时间与日期操作
蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址
msn官网入口地址手机版 msn官方网站手机最新链接
最新韩小圈网页版登录入口_官网在线观看官方链接
纯CSS与HTML网格布局的HTML精简策略:SVG与JS方案解析
抖音极速版最新版本 抖音极速版官方下载地址
必由学官网入口 必由学教师登录入口
Log4j Console Appender性能瓶颈与高并发优化策略
大麦的“候补”是什么意思 大麦候补购票规则【详解】
AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看
J*a应用集成GitHub CLI与API认证指南
怎样使用“本地安全策略”提升Windows安全性_Secpol.msc配置指南【高手】
QQ邮箱官方邮箱登录入口 QQ邮箱网页版快速访问
PHP面向对象编程中避免重复创建PDO数据库连接的最佳实践
优酷会员付费后没到账怎么办_优酷会员充值异常及解决方法
Lar*el 中按“Has One Of Many”关联模型排序的最佳实践
yandex入口引擎手机版 yandex安卓版下载入口
俄罗斯方块最新版入口 俄罗斯方块在线玩官网入口
Centos/Linux 系统下安装 composer 的完整步骤
2025-2030年全球乘用车销量预测:新能源成增长主力
《明末:渊虚之羽》设计师谈设计角色:那会刚毕业 充满激情
Composer中的^和~符号代表什么_精通Composer版本号语义化约束
c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧
如何创建独立于主系统的J*a运行环境_隔离式环境搭建策略
谷歌浏览器无痕模式怎么开 Chrome开启无痕浏览设置方法【教程】
韩小圈电脑版在线入口_网页版免费登录地址
蛙漫移动版在线看 蛙漫手机浏览器直达入口
在J*a中如何捕获IndexOutOfBoundsException_索引越界异常防护方法说明
Eclipse怎么运行工程_Eclipse工程运行配置说明
在VS Code中配置和运行Dart程序的完整步骤
《刺客信条:影》PS5 Pro和Switch 2画面对比
豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售
c++ dfs和bfs代码 c++深度广度优先搜索算法