草蟒完成操作系统模块,谈谈 python os 模块的中文化

栏目: 软件资讯 · 发布时间: 5年前

内容简介:草蟒对 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)

个人水平有限,不妥之处欢迎指教。

以上就是今天分享的内容,欢迎大家参与并支持草蟒的发展。

 


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Algorithms on Strings, Trees and Sequences

Algorithms on Strings, Trees and Sequences

Dan Gusfield / Cambridge University Press / 1997-5-28 / USD 99.99

String algorithms are a traditional area of study in computer science. In recent years their importance has grown dramatically with the huge increase of electronically stored text and of molecular seq......一起来看看 《Algorithms on Strings, Trees and Sequences》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

MD5 加密
MD5 加密

MD5 加密工具