python - 包 __init__.py 导入所有子文件,但只从另一个脚本加载一个?
问题描述
我创建了一个具有以下文件结构的包:
- package
- __init__.py
- load.py
- train.py
- test.py
我的__init__.py
文件只是这些文件的类的导入:
from package.load import Load
from package.train import Train
from package.test import Test
大多数时候,我想加载所有三个,但有时我只想专门加载其中一个类。例如,在一个临时脚本(包外)中,我希望能够只调用 Load 类,如下所示:
from package import Load
Load
虽然上述所有方法都适用于这个设计,但我遇到了一个问题,即当我像上面那样导入时,也会加载来自训练/测试的依赖项。如何设置__init__.py
文件,以便在import
不从训练/测试加载依赖项的情况下进行相同的调用?
补充说明:
我为什么这样做:我有一个问题,我希望某些人能够使用Load
仅使用基本 python 的类,但是训练/测试文件包含专门的依赖项,只有 Load 类的用户不想使用或甚至安装。
解决方案
这是一种非常接近你想要的东西的方法。您可以在其中定义一个函数来显式导入所需的任何类(或者如果未指定,则全部导入),而不是无条件地import
在您的.__init__.py
__init__.py
:
from pathlib import Path
import sys
print(f'In {Path(__file__).name}')
package_name = Path(__file__).parent.name
package_prefix = package_name + '.'
class_to_module_map = {'Load': 'load', 'Train': 'train', 'Test': 'test'}
def import_classes(*class_names):
namespace = sys._getframe(1).f_globals # Caller's globals.
if not class_names:
class_names = class_to_module_map.keys() # Import them all.
for class_name in class_names:
module = class_to_module_map[class_name]
temp = __import__(package_prefix+module, globals(), locals(), [class_name])
namespace[class_name] = getattr(temp, class_name) # Add to caller's namespace.
出于测试目的,这是我在load.py
脚本中添加的内容:(
我还在其他两个模块中添加了类似的内容,以验证它们是否被import
编辑。)
load.py
:
from pathlib import Path
print(f'In {Path(__file__).name}')
class Load: pass
最后,这是一个仅import
将其用于Load
类的示例:
ad_hoc.py
:
from my_package import import_classes
#from my_package import Load
import_classes('Load')
test = Load()
print(test)
随着产生的输出:
In __init__.py
In load.py
<my_package.load.Load object at 0x001FE4A8>
推荐阅读
- python - 为什么在 django 中使用本地图像测试 Fashion-mnist 模型时会得到“预期的字符串或类似字节的对象”?
- jboss - Wildfly Http 接口在部署时未侦听
- python - CNN 算法在 GPU 中进行并行处理时出错
- vhdl - 如何在输入序列 VHDL 中添加奇偶校验位
- mysql - Laravel API 资源,仅获取集合中最新出现的资源
- c++ - C++ 线程函数调用 - 将字符串转换为 ofstream 的问题
- javascript - 旋转的调整大小按钮在 Firefox 中奇怪地工作
- git - 无法将 github 从 ssh 重置为 https
- r - 在 R 中,删除一行的所有实例,其中恰好有 n 个重复项
- node.js - Keyv + MongoDb TypeError “id”参数必须是字符串类型。收到未定义