我想统一两个略有不同的脚本。
我的想法是将公共部分保存在文件( modX.py )中并创建另外两个文件以提供两个不同的入口点( A.py 和< EM> B.py )。公共部分将通过“导入”进行调用。
from modX import *
现在,我看不出如何在 modX 中包含特定部分。一个想法是在 A.py 和 B.py 中测试具有不同值的变量。
在 modX.py :
if 'is_A' in globals():
my_string = "spam"
else:
my_string = "eggs"
A.py :
is_A = True
from modX import *
print("I love {}".format(my_string))
my_string
如何获得“垃圾邮件”?
将函数中所有公共部分放在一起可以更加pythonic,如果可以的话,我会避免重构 modX.py 。
答案 0 :(得分:1)
我从来没有想过在导入时将参数传递给模块的方法 - 尽管它非常有用。但是,有一些方法可以解决这个限制,它利用了模块对象在首次导入 和 sys.modules字典中缓存的事实>可以用类的实例替换。请注意,分配给类实例(self
)的属性在存储在sys.modules
之后有效地成为模块的属性。
以下是您在示例中的使用方法:
<强> modX.py
强>
import sys
class MyModule(object):
def __init__(self, arg=None):
if arg == 'is_A':
self.my_string = 'spam'
else:
self.my_string = 'eggs'
def called_by(arg): # nested function - no self
import sys
# Replace module entry with new instance of MyModule
sys.modules[__name__] = MyModule(arg)
self.called_by = called_by
# Replace module entry in sys.modules[__name__] with a default instance of
# MyModule (and create an additional reference to original module so it's not
# deleted)
_ref, sys.modules[__name__] = sys.modules[__name__], MyModule()
del sys # clean-up namespace (optional)
<强> A.py
强>
from modX import *
called_by('is_A') # changes modX
from modX import * # do it again to get modified version
print("I love {}".format(my_string)) # -> I love spam
<强> B.py
强>
from modX import *
print("I love {}".format(my_string)) # -> I love eggs
答案 1 :(得分:0)
它不起作用的原因是因为 modX.globals()是 A.globals()
的不同对象你这样做: 在modX.py中:
def foo():
if 'is_A' in globals():
return "spam"
else:
return "eggs"
A.py:
from modX import *
modX.is_A = True
print("I love {}".format(foo()))
您也可以尝试在inspect模块中使用,也许您可以找到相应的方法。告诉我们它是否对您有所帮助。