Python中仅导入模块特性时,如何实现<module>.<feature>式显式调用
解决方案:仅导入特定函数并保留模块式调用
首先明确:from os import get_terminal_size只会把get_terminal_size函数导入当前命名空间,不会引入os这个模块名,所以直接用os.get_terminal_size()会触发NameError——当前代码里根本没有os这个名字。
另外要澄清一个误区:Python里不管用from module import feature还是import module,都会把整个模块加载到内存里。前者只是不在当前命名空间暴露模块名和其他属性,后者则会暴露模块名。不存在“完全不加载整个模块只拿单个函数”的情况,只能做到“不在当前命名空间引入多余内容,同时保留模块式调用方式”。
下面是两种可行的实现方式:
方式1:手动构建模块名的命名空间
你可以自己创建一个空对象,把导入的函数绑定到这个对象上,模拟模块的调用方式:
# 创建一个空类实例作为os命名空间 os = type('os', (), {})() # 导入目标函数 from os import get_terminal_size # 把函数绑定到os对象上 os.get_terminal_size = get_terminal_size # 可选:删掉当前命名空间里的get_terminal_size,避免重复 del get_terminal_size # 现在可以正常调用 os.get_terminal_size()
方式2:导入模块后清理无用属性
先导入整个模块,然后删除不需要的属性,只保留你要的函数:
import os # 定义需要保留的函数列表 required_features = {'get_terminal_size'} # 遍历模块属性,删除不需要的内容 for attr_name in dir(os): if attr_name not in required_features: try: delattr(os, attr_name) except AttributeError: # 有些内置属性无法删除,直接跳过 pass # 现在调用方式不变,且os模块在当前命名空间只暴露指定函数 os.get_terminal_size()
这两种方式都能满足你“用module.feature调用”且“不在命名空间引入多余内容”的需求,本质上都是在当前命名空间对模块对象做了限制,区别在于前者是手动构建对象,后者是清理原有模块对象。
内容的提问来源于stack exchange,提问作者NaCIO_Ghrelin
相关产品推荐
相关产品推荐

