python模块命名

最近在学习python,廖雪峰同学的博客很不错,在跟着写一个blog的时候搭建web框架时遇到如下问题,做一下记录

项目结构如图

此时运行报错如下:

"D:\Program Files\Python3.5\python.exe" D:\lhh\python\web\www\copy.py
Traceback (most recent call last):
  File "D:\lhh\python\web\www\copy.py", line 3, in <module>
    import asyncio, os, json, time
  File "D:\Program Files\Python3.5\lib\asyncio\__init__.py", line 21, in <module>
    from .base_events import *
  File "D:\Program Files\Python3.5\lib\asyncio\base_events.py", line 18, in <module>
    import concurrent.futures
  File "D:\Program Files\Python3.5\lib\concurrent\futures\__init__.py", line 17, in <module>
    from concurrent.futures.process import ProcessPoolExecutor
  File "D:\Program Files\Python3.5\lib\concurrent\futures\process.py", line 55, in <module>
    from multiprocessing.connection import wait
  File "D:\Program Files\Python3.5\lib\multiprocessing\connection.py", line 18, in <module>
    import tempfile
  File "D:\Program Files\Python3.5\lib\tempfile.py", line 43, in <module>
    import shutil as _shutil
  File "D:\Program Files\Python3.5\lib\shutil.py", line 13, in <module>
    import tarfile
  File "D:\Program Files\Python3.5\lib\tarfile.py", line 49, in <module>
    import copy
  File "D:\lhh\python\web\www\copy.py", line 6, in <module>
    from aiohttp import web
  File "D:\Program Files\Python3.5\lib\site-packages\aiohttp\__init__.py", line 7, in <module>
    from .protocol import *  # noqa
  File "D:\Program Files\Python3.5\lib\site-packages\aiohttp\protocol.py", line 14, in <module>
    from . import errors, hdrs
  File "D:\Program Files\Python3.5\lib\site-packages\aiohttp\errors.py", line 3, in <module>
    from asyncio import TimeoutError
ImportError: cannot import name 'TimeoutError'



注意,我运行的是app.py,但是此时报错的是copy.py。是因为copy这个模块名和系统的重复了,导致报错。希望对遇到同样错误的人有用。

转载于:https://my.oschina.net/u/551903/blog/671311

<think>好的,我需要回答用户关于Python封装模块命名规范的问题。首先,我应该回忆一下Python的官方命名规范,比如PEP8。PEP8是Python的编码风格指南,里面应该包含模块命名的部分。 模块名通常使用小写字母,单词之间用下划线分隔,比如`my_module.py`。这点我记得没错,但得确认一下是否有例外情况。例如,有些模块可能会使用驼峰命名法,但根据PEP8,应该是用小写和下划线。 另外,用户提到“封装模块”,可能涉及到包的命名。包名也应该遵循小写和下划线的规则,并且尽量简短。避免使用连字符或者其他符号。同时,模块名应该是描述性的,让其他开发者一看就知道模块的功能。 还有命名冲突的问题,比如不要和标准库模块同名。比如,不要将模块命名为`math.py`或者`sys.py`,这会导致导入时出现问题。这点需要提醒用户注意。 关于私有模块或内部模块,通常会在名字前加下划线,比如`_internal_module.py`,表示模块是内部使用的,不建议外部直接引用。这也是PEP8中的建议吗?是的,我记得单下划线前缀用于表示模块内部使用。 还有命名长度的问题,虽然PEP8建议每行不超过79个字符,但模块名需要简短且有意义,避免过长。比如用`data_processing`而不是`module_for_processing_data`。 另外,用户可能关心的是模块的导入规范。比如,如果模块作为脚本运行,应该使用`if __name__ == "__main__":`来隔离执行代码。这部分虽然不是命名规范,但和模块结构相关,可能需要提及。 还需要考虑命名中的缩写问题。是否应该避免缩写?比如使用`message_queuing`而不是`msg_q`,以提高可读性。根据PEP8,明确性比简洁性更重要,所以应该尽量避免晦涩的缩写。 测试模块命名规范,比如在tests目录下,模块名以`test_`开头,例如`test_models.py`。这也是常见的做法,符合unittest或pytest框架的要求。 最后,应该提到一些最佳实践,比如遵循项目内部的命名约定,保持一致性。如果项目已经有特定的命名方式,即使和PEP8不完全一致,也应该优先遵守项目规范,以保持代码统一。 总结一下,模块命名规范主要包括: 1. 小写字母和下划线 2. 简短且描述性强 3. 避免与标准库冲突 4. 内部模块加下划线前缀 5. 测试模块以test_开头 6. 避免缩写,保持可读性 同时,可能需要引用相关的PEP8文档和最佳实践链接,确保回答的准确性。用户提供的引用中有提到PEP8规范,可以引用[^2]和[^3]。例如,引用[^2]提到Python的代码格式符合PEP8规范,而引用讨论了类型提示,虽然不直接相关,但可以强调代码可读性的重要性。</think>在Python中,模块命名规范遵循PEP8标准,旨在提高代码可读性和一致性。以下是核心规则和最佳实践: --- ### 一、模块命名规则 1. **全小写与下划线分隔** 模块名应使用全小写字母,单词间以下划线`_`连接,例如: ```python data_processor.py # 正确 DataProcessor.py # 避免驼峰式 data-processor.py # 避免连字符 ``` 2. **简短且描述性** 名称需清晰描述功能,避免冗余或模糊: - 推荐:`file_utils.py`(文件工具) - 不推荐:`utils_for_handling_files.py`(冗长) 3. **避免与标准库冲突** 禁止使用标准库同名模块(如`sys.py`、`math.py`),否则会导致导入冲突[^2]。 4. **内部模块标识** 若模块仅供内部使用,可添加单下划线前缀,例如:`_internal_utils.py`,表示不推荐外部直接导入。 --- ### 二、包(Package)命名规范 1. **全小写与简短名称** 包名遵循模块规则,且尽量简短: ```python image_processing/ # 正确(图像处理包) img_proc/ # 可接受缩写,但需确保易懂 ``` 2. **避免复数形式** 包名通常为单数(如`utils`而非`utilities`),除非明确表示集合(如`tests`)。 --- ### 三、特殊场景规范 1. **测试模块命名** 测试文件以`test_`开头,例如`test_models.py`,便于测试框架自动发现。 2. **兼容性模块** 为兼容旧版本代码,可添加版本后缀,例如:`logging_py2.py`(Python 2兼容模块)。 3. **主程序模块** 若模块作为可执行脚本,建议添加`if __name__ == "__main__":`隔离执行逻辑: ```python # main.py def run(): print("Running...") if __name__ == "__main__": run() ``` --- ### 四、最佳实践 1. **一致性优先** 若项目已有命名习惯(如全小写无下划线),应优先遵循项目规范。 2. **类型提示与文档** 结合`typing`模块为函数添加类型注解,提升可读性,例如: ```python from typing import List def process_data(data: List[str]) -> None: """处理字符串列表""" ``` 3. **避免缩写** 除非广泛认可(如`http`),否则尽量使用完整单词,例如: - 推荐:`configuration.py` - 避免:`config.py`(若团队认可则可接受) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值