我曾经写过御用文件 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_name
和 PurePath.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
, pathname
和 dir
等类型为 Path
.
其六,其实只要遵循以上编程规范,跨平台自然也就水到渠成了。
Written with StackEdit .