转载

御用 Path 规范

我曾经写过御用文件 IO 命名规范,那时给文件对象名起个 file 后缀,即 *_file , 且规定:凡格式贯彻 *_filename , *_pathname*_dir 的 identifier 都一定指向 str 对象,且当时只考虑 Linux 上的路径拼接,自然直接用 / 当 sep.

不过如今用 Python 处理路径多了,不免开始考虑模块化,对应的则有经典 os.path 库,但 JaHIY 推荐了 Python 3.4 新出的 pathlib , 我试了下,发现明显比前者好用多了,有很多有用的函数,比如 PurePath.suffix , PurePath.parent PurePath.name , PurePath.with_namePurePath.home 等等,此外直接用除法符号当拼接路径的操作符也令人眼睛一亮。于是我重新制定了基于路径上的新命名规范:

其一,所有 *_filename , *_pathname*_dir 的 identifier 都统统用 Path 类型,用没有 IO 副作用即不影响文件系统的子类型 PurePath 也可以。

home_dir = Path.home()

其二, pathname 一样用绝对路径, filename 用不包含任何目录分隔符的相对路径。不论是不是目录,都不再加额外的目录分隔符后缀,比如 / , 当然,文件名还是要加 suffix.

其三,拼接目录用 / , 必要时还可以用括号来 wrap line:

testset_dir = home_dir / 'BigDatas/daytime/testset'
cascade_model_dir = (
rp_dir
/ 'models/cascade_models/20x20-HAAR-14-0.99-0.5')

其四,虽说核心对类型是 Path 而不再是 os.path 所处理的 str, 好在互相转换也方便,只要在外围把 Path 类型对象传入接收 str 对象的函数时,再使用 str 函数转换即可,就和外围处理具体编码内部处理 Unicode 一样,甚至也 可以用 map 来一气呵成地转换 ;反之亦然,即用 Path 函数转换,甚至可以无缝地直接套在原本的 format 函数上:

filename = Path('{}{}{}'.format('cascade', num_stage, '.xml'))

话说要是 Python 内置库自发支持 pathlib 就好了,这样不用在 open 里显式转换为 str 对象了,直接传路径来来去去,多爽!

其五,为了照顾不熟悉 pathlib 的同行,可以用 type hints 来强调您所期望的 filename , pathnamedir 等类型为 Path .

其六,其实只要遵循以上编程规范,跨平台自然也就水到渠成了。

Written with StackEdit .

原文  http://tech.acgtyrant.com/御用-Path-规范/
正文到此结束
Loading...