gpt4 book ai didi

python - 从导入的模块重新定义被调用的函数

转载 作者:行者123 更新时间:2023-12-03 19:16:00 26 4
gpt4 key购买 nike

例如,我有 mod1.py:

def foo():
bar()

def bar():
print("This is bar in mod1")

还有一个 mod2.py:
from mod1 import *

def bar():
print("This is bar in mod2")

然后是 mod3.py:
import mod1
import mod2

mod1.foo()
mod2.foo()

运行 mod3.py 后,我得到相同的输出:“这是 mod1 中的栏”,即使我在 mod2.py 中重新定义了它。

据我了解,当我在 mod2 中调用 foo 时,它会在 mod1 中查找它,因为我导入了它并且没有重新定义它。

有没有办法让 foo 在 mod2 而不是 mod1 中寻找 bar?

Ofc 无需将 foo 复制到 mod2 或触摸 mod1 中的 foo 或 bar 并且能够在 mod3 中调用它们,通过它们的命名空间来区分,如 mod3.py 示例。

最佳答案

难度不大,传入bar即可明确地。

仔细阅读该问题后, 是禁区。 mod1.py 不能碰。哦,好吧,还是别说了。

mod1.py

def bar():
print("This is bar in mod1")

def foo(bar=bar):
bar()


mod2.py 不变

模组3.py
import mod1
import mod2

mod1.foo()
mod2.foo()
mod2.foo(mod2.bar)

输出:
This is bar in mod1
This is bar in mod1
This is bar in mod2

更新:不接触 mod1 的来源:

Monkeypatching,或多或少。线程安全?可能不是。
import mod1
import mod2

mod1.foo()

ori_bar = mod1.bar

# I think this would be a good place for a context manager rather than
# finally which needs adjustments to handle exceptions
try:
mod1.bar = mod2.bar
mod2.foo()
finally:
mod1.bar = ori_bar

mod1.foo()

输出:
This is bar in mod1
This is bar in mod2
This is bar in mod1

术语方面,原始 foo执行算不算闭包?因为我相信这种特定行为在 Python 中已经存在了很长时间。

关于python - 从导入的模块重新定义被调用的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60571418/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com