我在使用来自两个不同文件的git(gitpython)repo时遇到了一个问题。但是,我不能想出一个聪明的方法,只克隆一次,然后在模块之间共享对象。回购相当大,所以每次需要访问对象时都克隆它们并不是最佳选择。在
我尝试在一个名为utils.py
的文件中创建一个类及其实例。然而,当我导入它们时,似乎并没有克隆这些repo,即使它应该发生在utils.py
中类的__init__
中。当然,这必须是一些Python的保护措施,以防止挂起进口。在
我尝试过将dict子类化,并在访问时使用__getattr__
来克隆它,如果它还没有被访问,但它不起作用。它看起来像是刚导入的,但像以前一样跳过了克隆。在
这是我需要在utils.py
中定义的,以便可以将其导入其他位置:
compiler_repo = git.Repo.clone_from(someurl, somepath)
init中的代码只是python代码,与其他代码一样运行。如果在其中放置无限循环或阻塞等待,则导入确实可以挂起。在
通过将昂贵的初始化代码放入应用程序调用的函数中,可以最小化库的启动时间。它不会改变要完成的工作量,但至少工作的时间安排在应用程序的控制之下,而且更容易找出出什么问题(失败的init代码可能很难调试)。在
有多种方法可以隐藏初始化步骤。例如,可以使用延迟加载程序定义类:
在您的软件包的其他地方,您可以使用以下方式请求回购:
^{pr2}$现在,包的用户可以调用
utils.compiler.fetch_repo()
作为初始化步骤,如果他们想控制何时发生,或者他们可以把它留给应用程序。只需再做一点工作,就可以将fetch_repo放在一个单独的线程中,这样其余的应用程序初始化就可以继续了,并且只在代码需要repo时才阻塞它。在相关问题 更多 >
编程相关推荐