【问题标题】:Overriding module function after it is imported - Python导入后覆盖模块函数 - Python
【发布时间】:2020-06-23 14:09:11
【问题描述】:

假设我们有三个 python 模块:app.py、commons.py 和 c.py

commons.py:

def func():
    pass

def init(app)
    global func
    func = app.func

app.py:

import commons
import c
# Doing some initialization so that we are ready to override the function
c.foo()
init(app) # the app object contains a function called func which we wish to overwrite in commons.py
c.foo()

c.py:

from commons import *
def foo():
    func()

我想要完成的是第一次调用c.foo,它什么都不做,第二次它会执行app.func。我项目中的每个模块都依赖于 commons.py 中的 func,并且该函数必须在运行时声明,因为它附加到一个对象。

有没有办法在python中通过引用导入并更改所有模块中的函数指针?

到目前为止,我所做的是在每个模块中都有一个 init 函数并简单地覆盖空的 lambda 函数,但这似乎是一个糟糕的解决方案。

【问题讨论】:

    标签: python oop import reference python-import


    【解决方案1】:

    您可以通过更高级别的间接来实现这一点:

    commons.py

    def normalFunc():
        pass
    def func():
        normalFunc()
    
    def init(app)
        global normalFunc
        normalFunc = app.func
    

    这是可行的,因为任何其他具有正常:from commons import foofoo() 的模块仍然调用相同的 foo()

    只是foo()的内部结构在每次调用init()函数时都会发生变化。

    【讨论】:

    • 谢谢,这解决了问题。但是,在这种情况下不应该是全局 normalFunc 吗?另外,你有解释为什么会这样吗?
    • 抱歉,我会修复global normalFunc
    猜你喜欢
    • 2018-12-10
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    相关资源
    最近更新 更多