Python项目为何采用父目录含-、子目录换为_的命名结构?
关于Python包目录结构的疑问解答
核心结论
仓库的父目录(比如abc-def)和子包目录(abc_def)没有强制要求必须对应(仅把-替换为_),这只是社区里常见的命名惯例,而非硬性规则。
具体解释
Python包目录的硬性要求
子包目录的名称必须是Python合法标识符——也就是不能包含-、空格这类字符,只能用字母、数字、下划线_,否则会像你遇到的那样,执行import abc-def直接触发语法错误。所以包目录必须用abc_def这种合法名称。仓库父目录与setup.py的name参数
- 仓库的父目录名称完全是自由的,你可以随便命名,比如叫
abc_package_repo或者其他名字都没问题,它不影响包的安装和导入。 - setup.py里的
name参数是这个包在PyPI上的显示名称,PyPI允许用-分隔(比如很多知名包scikit-learn、beautifulsoup4都是如此),所以很多项目会把仓库名和PyPI包名保持一致(用-),同时把包目录换成_格式的合法标识符,这只是为了让用户能直观关联起仓库和实际导入的包,属于约定俗成的做法,不是强制要求。
- 仓库的父目录名称完全是自由的,你可以随便命名,比如叫
灵活的命名示例
你完全可以这样设置:my-abc-package-repo |-abc_def |-setup.pysetup.py里:
setup( name="abc-def-package", )只要包目录
abc_def是合法的导入名称,用户安装后依然可以正常import abc_def,完全不受仓库目录和PyPI包名的影响。
内容的提问来源于stack exchange,提问作者desert_ranger
相关产品推荐
相关产品推荐

