统一python脚本保留特定部分

时间:2016-06-01 14:00:28

标签: python module

我想统一两个略有不同的脚本。

我的想法是将公共部分保存在文件( 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

2 个答案:

答案 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模块中使用,也许您可​​以找到相应的方法。告诉我们它是否对您有所帮助。