克隆git存储库并导入对象elsewh

2024-10-06 12:14:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我在使用来自两个不同文件的git(gitpython)repo时遇到了一个问题。但是,我不能想出一个聪明的方法,只克隆一次,然后在模块之间共享对象。回购相当大,所以每次需要访问对象时都克隆它们并不是最佳选择。在

我尝试在一个名为utils.py的文件中创建一个类及其实例。然而,当我导入它们时,似乎并没有克隆这些repo,即使它应该发生在utils.py中类的__init__中。当然,这必须是一些Python的保护措施,以防止挂起进口。在

我尝试过将dict子类化,并在访问时使用__getattr__来克隆它,如果它还没有被访问,但它不起作用。它看起来像是刚导入的,但像以前一样跳过了克隆。在

这是我需要在utils.py中定义的,以便可以将其导入其他位置:

compiler_repo = git.Repo.clone_from(someurl, somepath)


Tags: 模块文件对象实例方法pygitinit
1条回答
网友
1楼 · 发布于 2024-10-06 12:14:08

init中的代码只是python代码,与其他代码一样运行。如果在其中放置无限循环或阻塞等待,则导入确实可以挂起。在

通过将昂贵的初始化代码放入应用程序调用的函数中,可以最小化库的启动时间。它不会改变要完成的工作量,但至少工作的时间安排在应用程序的控制之下,而且更容易找出出什么问题(失败的init代码可能很难调试)。在

有多种方法可以隐藏初始化步骤。例如,可以使用延迟加载程序定义类:

class RepoLoader:
    def __init__(self, url, path):
        self.url = url
        self.path = path
        self._repo = None

    def fetch_repo(self):
        self._repo = git.Repo.clone_from(self.url, self.path)

    @property
    def repo(self):
        if self._repo is None:
            self.fetch_repo()
        return self._repo

compiler = RepoLoader(someurl, somepath)

在您的软件包的其他地方,您可以使用以下方式请求回购:

^{pr2}$

现在,包的用户可以调用utils.compiler.fetch_repo()作为初始化步骤,如果他们想控制何时发生,或者他们可以把它留给应用程序。只需再做一点工作,就可以将fetch_repo放在一个单独的线程中,这样其余的应用程序初始化就可以继续了,并且只在代码需要repo时才阻塞它。在

相关问题 更多 >