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
你注意到你真正想要的是什么了吗?只是一个默认参数。
是否可以在 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
你注意到你真正想要的是什么了吗?只是一个默认参数。