我正在写一个 python 包
foolib
,它定义了一个类foolib.Foo
。创建一个全新的 Foo
对象读取一个 data_in
参数,然后执行昂贵的数值最小化,除非在实例化声明中也指定了此最小化的结果。完成后,我可以通过编写包含此最小化结果的实例化声明来“导出”此 Foo
实例,这意味着导入导出的代码将不需要再次执行最小化:
class Foo():
def __init__(self, data_in, results = None):
self.data_in = data_in
if results is None:
self.results = expensive_numerical_minimization(data_in)
else:
self.results = results
def export(self, name, filename):
with open(filename, 'w') as fid:
fid.write(f'{name} = Foo({repr(self.data_in)}, {repr(self.results)})')
我希望面向用户的代码看起来像这样:
from foolib.prebuilt import first_foo, second_foo
在哪里
first_foo
,second_foo
在我的包发布之前使用以下代码预先最小化:
from foolib import Foo
foo1 = Foo(123456) # takes a while
foo1.export('first_foo', 'foo1.py')
foo2 = Foo(345678) # takes a while
foo2.export('second_foo', 'foo2.py')
我的问题是我不知道如何将
foo1
和 foo2
干净地导入子模块 foolib.prebuilt
,在使用包时不会暴露 foo1.py
和 foo2.py
文件本身。理想情况下,访问第一个预构建实例的唯一方法是通过 foolib.prebuilt.first_foo
而不是通过 foolib.foo1.first_foo
.
是否有一种规范的、优雅的方式来实现这一目标?