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

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

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

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

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

 


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

查看所有标签

猜你喜欢:

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

Node.js实战

Node.js实战

[美] Mike Cantelon、[美] TJ Holowaychuk、[美] Nathan Rajlich / 吴海星 / 人民邮电出版社 / 2014-5 / 69.00元

服务器端JavaScript?没错。Node.js是一个JavaScript服务器,支持可伸缩的高性能Web应用。借助异步I/O,这个服务器可以同时做很多事情,能满足聊天、游戏和实时统计等应用的需求。并且既然是JavaScript,那你就可以全栈使用一种语言。 本书向读者展示了如何构建产品级应用,对关键概念的介绍清晰明了,贴近实际的例子,涵盖从安装到部署的各个环节,是一部讲解与实践并重的优秀......一起来看看 《Node.js实战》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

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

Base64 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换