Python 多个其他模块重用同一个模块

Python reuse the same module by multiple other modules

是否可以在 python 中实现?基本上,shared_fun() 是一个非常常用的实用函数,用于多个模块(user_module1 和 user_module2)。但是,每个用户想要的参数略有不同 SHARE_GLOBAL_VAR.

我想要这样的一些动机:

一个。想象一下有很多shared_fun(), shared_fun1(), shared_fun2() ......而且都依赖同一个SHARE_GLOBAL_VAR但用它做不同的事情。因此,我真的不想让 SHARE_GLOBAL_VAR 成为每个 shared_fun(SHARE_GLOBAL_VAR)

的论点

乙。我想让 shared_fun() 的维护变得容易,这样我就不想将代码单独复制到每个 user_module.py 文件中。

我认为任务归结为在每个 user_module 命名空间内复制共享模块命名空间,我不确定这在 python.

中是否合法
#share.py:
SHARE_GLOBAL_VAR = 0
def shared_fun():
    return SHARE_GLOBAL_VAR

#user_module1.py:
import share
share.SHARE_GLOBAL_VAR = 1
def user1_fun():
    return share.shared_fun()

#user_module2.py:
import share
share.SHARE_GLOBAL_VAR = 2
def user2_fun():
    return share.shared_fun()

#main.py:
import user_module1
import user_module2
# expecting a result of 1
print(user_module1.user1_fun())
# expecting a result of 2
print(user_module2.user2_fun())

您可以利用闭包的概念,例如

def sharedFun():
    shared_var=0
    def getSharedVariable(shared_value=None):
        if shared_value:
            return shared_value
        else:
            return shared_var
    return getSharedVariable


shared=sharedFun()
print shared(1) # output 1
print shared(2) # output 2
print shared(3) # output 3
print shared() # output 0

您可以找到有关闭包的更多信息here

对于磁盘上的给定文件,每个进程最多有一个内存中模块对象,因此您上面显示的在一个进程中多次导入的内容将不起作用。这就是为什么第 3 方库模块 'impolite' 到 'monkey patch' 标准库模块以及为什么通常不鼓励使用全局数据变量。

关闭太棒了!!!我对函数式编程知之甚少,但这确实激励我深入研究它。

另一方面,我刚刚针对我的具体问题提出了一个 OOP 解决方案:将 shared.py 设为 class 并将所有 shared_fun 设为 class方法,而 SHARE_GLOBAL_VAR 现在是 class 数据成员。每个 user_module1/2 现在将只实例化共享 class 与不同 SHARE_GLOBAL_VAR 的一个对象。

这实现了通过 class 创建 share_fun 的多个副本的类似想法,而不是复制模块导入(根据 这是不可能的)。

在这种情况下,我对 OOP 和 Functional 进行了非常天真的比较:闭包解决方案在创建不同版本的函数方面提供了更多的自由。由于闭包为每个函数而不是每个 GLOBAL_SHARE_VAR 提供函数重复,因此它节省了创建 OOP 解决方案从未使用过的不必要方法的开销。

是时候认真对待函数式编程了!

认领小伙子。让我一步一步为你解释。

首先,仔细查看您接受的答案。其实这个答案和你原问题的修改版没有本质区别。

#share.py:
SHARE_GLOBAL_VAR = 0
def getSharedVariable(shared_value=None):
    if shared_value:
        return shared_value
    else:
        return SHARE_GLOBAL_VAR

在接受的答案中,范围是函数 sharedFun,而范围是上面代码段中的模块。有几乎一样的。您可以像这样使用上面的代码片段:

import share
shared = share.getSharedVariable
print shared(1) # output 1
print shared(2) # output 2
print shared(3) # output 3
print shared() # output 0

您仍在向 getSharedVariable 传递相同的值。

此外,让我们谈谈您的 OOP 解决方案。这是毫无意义的。如果每个对象都会有自己不同的SHARE_GLOBAL_VAR,为什么这个变量叫SHARE_GLOBAL_VAR?它只是一个普通的局部变量。

最后,让我们修改已接受的答案:

# assume SHARE_GLOBAL_VAR equals to 0.
def getSharedVariable(shared_value=SHARE_GLOBAL_VAR):
    return shared_value

shared = getSharedVariable
print shared(1) # output 1
print shared(2) # output 2
print shared(3) # output 3
print shared() # output 0

你注意到你真正想要的是什么了吗?只是一个默认参数。