内容简介:草蟒对 python os 模块的汉化成果——“操作系统”模块(以 Windows 部分为主)已于今日完成,不久就会整合到草蟒 3.8.0 一月发行版中。 令人高兴的是,python 官网的中文文档做得越来越好了,草蟒的文档部分大量...
草蟒对 python os 模块的汉化成果——“操作系统”模块(以 Windows 部分为主)已于今日完成,不久就会整合到草蟒 3.8.0 一月发行版中。
令人高兴的是,python 官网的中文文档做得越来越好了,草蟒的文档部分大量采用了官网的相关内容。
这篇文章的主要目的是谈谈 os 模块的汉化心得体会,以供日后及其他人参考。其中使用的技术可能对初学者也有帮助。
stat_result(状态结果)的汉化
stat_result 是 状态()|stat()、状态l()|lstat()、状态f()|fstat() 等函数的返回结果,在 python 中既可作为 10-元素元组访问,也可通过打点加属性名(“.属性”)的方式访问。它有一二十个属性(具体数量视操作系统而定),所以不能简单地使用“具名元组”来汉化。在 C 源代码中,此对象是一个结构体,其属性名称和值是通过指针偏移关联起来的,所以也不能以在结构体中增加中文别名的方式来汉化。
因此,需要在草蟒的“操作系统”模块中写一个“状态结果”类,将相关函数返回的 stat_result 包装一下,并实现上面所说的行为。代码如下:
_状态元组 = 具名元组("状态结果", ['模式', '索引节点', '设备', '硬链接数',
'用户id', '组id', '大小', '访问时间', '修改时间', '创建时间'])
类 状态结果:
函 __初始化__(自身, stat_result): # 对stat_result 进行封装
自身.模式 = stat_result.st_mode # 提供中文属性
自身.索引节点 = stat_result.st_ino
自身.设备 = stat_result.st_dev
...
如果 有属性(stat_result, 'st_blksize'):
自身.块大小 = stat_result.st_blksize
如果 有属性(stat_result, 'st_blocks'):
自身.块数 = stat_result.st_blocks
...
自身._状态元组 = _状态元组(自身.模式, 自身.索引节点, 自身.设备,
自身.硬链接数, 自身.用户id, 自身.组id, 自身.大小,
自身.访问时间, 自身.修改时间, 自身.创建时间)
函 __表示__(自身): # 实现元组的外观
返回 'os.' + 串(自身._状态元组)
函 __取元素__(自身, n): # 部分属性支持通过下标获取,n 可以是切片值
返回 自身._状态元组[n] # python 的灵活性令人惊叹
函 状态(路径, *, dir_fd=空, 跟踪符号链接=真) -> '状态结果':
# 返回的是 状态结果 对象,所有属性都已中文化
返回 状态结果(stat(路径, dir_fd=dir_fd, follow_symlinks=跟踪符号链接))
scandir(扫描目录)的汉化
scandir 返回一个迭代器对象 ScandirIterator,其迭代产生的每个元素是一个 DirEntry(目录条目类)对象。DirEntry 对象的属性和方法倒是支持在 C 代码中以取别名的方式汉化,但有一个例外——stat() 方法。如果取别名为 状态() 方法,其返回的将是 stat_result,而不是我们上面汉化的“状态结果”。因此,首先要写一个 目录条目类 对这个迭代器的元素包装一下,然后写一个条目迭代器对迭代器本身进行包装。另外需要注意的是,此迭代器还支持上下文管理协议,所以汉化的迭代器还要实现 __进入__() 和 __退出__() 方法。
类 目录条目类:
函 __初始化__(自身, dirEntry):
自身.名称 = dirEntry.name
自身.路径 = dirEntry.path
自身._entry = dirEntry
函 __表示__(自身):
返回 '<%s %s>' % (自身.__类__.__名称__, 自身.名称)
...
函 是文件(自身, 跟踪符号链接=真):
返回 自身._entry.is_file(follow_symlinks=跟踪符号链接)
函 状态(自身, 跟踪符号链接=真): # 用之前写的 状态结果 类进行包装
返回 状态结果(自身._entry.stat(follow_symlinks=跟踪符号链接))
...
类 _条目迭代器:
函 __初始化__(自身, 容器): # 使用 scandir 返回的迭代器对象进行封装
自身.容器 = 容器
函 __下一个__(自身): # 在这里对每个条目进行汉化
返回 目录条目类(下一个(自身.容器))
函 __迭代__(自身): # 实现迭代器
返回 自身
函 __进入__(自身): # 支持 管 ... 为 ... 语句
返回 自身
函 __退出__(自身, 异常类型, 异常值, 异常回溯): # 后面三个参数虽然没用上,但不能少
自身.容器.close()
函 关闭(自身): # 像原迭代器一样提供一个 关闭() 方法
自身.容器.close()
函 扫描目录(路径=空):
返回 _条目迭代器(scandir(路径))
下面是汉化结果与未汉化结果的对比:
导入 操作系统 为 os
管 os.扫描目录() 为 迭代器:
取 条目 于 迭代器:
如果 非 条目.名称.开头是('.') 且 条目.是目录():
打印(条目)
打印(条目.状态())
# 汉化结果
<目录条目类 '新目录'>
os.状态结果(模式=16895, 索引节点=0, 设备=0, 硬链接数=0, 用户id=0, 组id=0, 大小=0, 访问时间=1610245161, 修改时间=1610111250, 创建时间=1610111250)
# 英文结果
<DirEntry '新目录'>
os.stat_result(st_mode=16895, st_ino=0, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=0, st_atime=1610245161, st_mtime=1610111250, st_ctime=1610111250)
个人水平有限,不妥之处欢迎指教。
以上就是今天分享的内容,欢迎大家参与并支持草蟒的发展。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- FriceEngine试用与API中文化
- api 中文化之 Rust-curl(上)
- 草蟒 12 月更新:核心功能文档和坑属性/方法完成中文化
- Node.js模块系统 (创建模块与加载模块)
- 黑客基础,Metasploit模块简介,渗透攻击模块、攻击载荷模块
- 022.Python模块序列化模块(json,pickle)和math模块
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。