Python如何调用下划线开头的方法?调用datetime._cmp报错如何解决
原因解释
1 单下划线命名的常规规则
Python中单个前置下划线是约定俗成的「内部使用」标识,规则如下:
- 当使用
from 模块名 import *导入时,所有单下划线开头的成员都会被排除,不会导入到当前命名空间,这就是你测试自定义模块时直接调用_private_api()报错的原因。 - 当使用
import 模块名导入整个模块时,纯Python实现的模块可以直接通过模块名._私有成员名访问对应内容,和你自定义模块的测试结果一致。
2 datetime模块调用失败的特殊原因
你查阅的是CPython官方仓库中纯Python实现版本的datetime源码,但绝大多数Python环境默认加载的是预编译的C语言实现版本的datetime模块,C版本没有把_cmp这类内部辅助函数暴露到模块属性中,因此访问时会抛出AttributeError,不是单下划线规则失效。
调用单下划线开头方法的方案
注意:所有单下划线开头的成员都属于内部实现,官方没有公开API的兼容性承诺,不同版本可能随时修改、删除,生产环境不建议依赖这类成员。
- 普通自定义纯Python模块:直接导入整个模块后调用即可,语法为
模块名._私有函数名()。 - 标准库中存在C实现的模块(如datetime):
- 强制导入纯Python版本的对应模块,示例代码如下:
import sys # 清除已加载的默认C实现datetime sys.modules.pop('datetime', None) # 禁用C实现的导入路径 sys.modules['_datetime'] = None # 此时导入的就是纯Python实现的datetime import datetime print(datetime._cmp(1, 2))- 更稳妥的方案:直接把你需要的私有函数的实现逻辑复制到自有代码中使用,完全避免依赖内部实现。
- 类的单下划线方法:确认对应版本存在该方法后,直接通过
实例._方法名(参数)调用即可。
内容的提问来源于stack exchange,提问作者Shambhav Agrawal
相关产品推荐
相关产品推荐

