在 Python 包中优雅地包含动态生成的代码

问题描述 投票:0回答:0

我正在写一个 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
.

是否有一种规范的、优雅的方式来实现这一目标?

python python-packaging
© www.soinside.com 2019 - 2024. All rights reserved.