Python 在两个单独的位置对模块进行沙箱/复制,以防止覆盖或修补

Python 在两个单独的位置对模块进行沙箱/复制,以防止覆盖或修补,python,Python,使用这四个文件,所有文件都位于同一目录中: splitter.py a、 派克 b、 派克 实验.py experience.py的输出为: a|b|c|d ['a', 'b', 'c', 'd'] #okay... everything is fine a,b,c,d ['a,b,c,d'] #not what the programmer expected.. should be split on commas 有没有办法防止这种结果?在这种情况下,a.py和b.py可能是由两个不同的同事

使用这四个文件,所有文件都位于同一目录中:

splitter.py a、 派克 b、 派克 实验.py
experience.py
的输出为:

a|b|c|d
['a', 'b', 'c', 'd'] #okay... everything is fine
a,b,c,d
['a,b,c,d'] #not what the programmer expected.. should be split on commas
有没有办法防止这种结果?在这种情况下,
a.py
b.py
可能是由两个不同的同事编写的,但是a的代码会影响b。有时覆盖模块中的某些内容(例如monkeypatching)是有用的,但在这种情况下,它会产生令人困惑的行为

是否有某种方法可以在执行过程中复制模块或沙盒,以便
a.py
不会覆盖
splitter.py
中的值,并最终影响
b.py

另外,让我们假设,我们不是简单的
a.py
b.py
,而是在mod_python或其他模式下运行100个web应用程序(尽可能共享以减少内存),有没有办法防止一个恶意应用程序修补模块并破坏所有其他应用程序?当然,谷歌应用程序引擎(GoogleAppEngine)已经解决了这个问题:)

“有什么方法可以防止这个结果吗?”

对。找到修补模块的人,让他们停下来

Monkeypatching不需要花哨的代码处理。它只需要人们合作

如果你写了一个模块,而某个同事把它搞得一团糟,你应该和那个同事谈谈。从长远来看,它更便宜、更简单、更有效。

有什么方法可以防止这种结果吗?

对。找到修补模块的人,让他们停下来

Monkeypatching不需要花哨的代码处理。它只需要人们合作


如果你写了一个模块,而某个同事把它搞得一团糟,你应该和那个同事谈谈。从长远来看,它更便宜、更简单、更有效。

当您实例化
拆分器时,您可以将它的默认拆分字符设置为您想要的任何字符,并为其创建一个setter,以便人们可以更改它。

当您实例化
拆分器时如何,您可以将其默认拆分字符设置为您想要的任何字符,并为其创建一个setter,以便人们可以更改它?

另一种防止这种情况的方法是“提示”拆分器。拆分字符是“私有”的,方法是将其称为“拆分字符”。发件人:

\u单个\u前导\u下划线
:弱“内部使用”指示器。例如,“from M M import*”不会导入名称以下划线开头的对象

仅对非公共方法和实例变量使用一个前导下划线


因此,虽然这两个用户都没有喊“别惹我”,但这是对下一个用户的提示,至少如果他们熟悉Python的风格。

另一种防止这种情况的方法是“提示”splitter.SPLIT\u CHAR是“私有”的,称之为“SPLIT\u CHAR”。发件人:

\u单个\u前导\u下划线
:弱“内部使用”指示器。例如,“from M M import*”不会导入名称以下划线开头的对象

仅对非公共方法和实例变量使用一个前导下划线


因此,虽然这两位用户都没有喊出“别惹我”,但这是对下一位用户的一个提示,至少如果他们熟悉Python的风格。

我不会称之为monkeypatching。我不会称之为monkeypatching。啊,文化上的回答:)这在一些人或同事之间是有意义的,但在谷歌应用程序引擎之类的情况下,这是不切实际的。在这两个极端之间,我想知道是否有一种技术可以用来处理这种情况。在GAE的案例中,蒙基修补者设法把事情搞砸了——而且——嗯——他们把事情搞砸了。这是Python。来源是可用的。我们都是成年人。如果你把事情搞砸了,那是你的错。没有必要使用花哨的代码来防止人们搞砸。写下最简单的事情,然后就这样吧。啊,文化上的答案:)这在一些人或同事之间是有道理的,但在像谷歌应用程序引擎这样的情况下,这是不切实际的。在这两个极端之间,我想知道是否有一种技术可以用来处理这种情况。在GAE的案例中,蒙基修补者设法把事情搞砸了——而且——嗯——他们把事情搞砸了。这是Python。来源是可用的。我们都是成年人。如果你把事情搞砸了,那是你的错。没有必要使用花哨的代码来防止人们搞砸。写下最简单有效的东西,就这样吧。是的,a.py应该这么做。我指的是有人(恶意或出于无知)试图覆盖模块中的某些内容以获得不同的行为。谢谢。在原始类中添加一个函数,每次使用该函数时,该函数都会将行为重置为默认值。我不知道还能说什么。是的,a.py应该这么做。我指的是有人(恶意或出于无知)试图覆盖模块中的某些内容以获得不同的行为。谢谢。在原始类中添加一个函数,每次使用该函数时,该函数都会将行为重置为默认值。我不知道还能说什么。
#this person makes the mistake of re-setting the global variable
#in splitter to get different behavior, instead of just passing
#in the extra argument
import splitter

splitter.SPLIT_CHAR = '|'

def go():
    s1 = splitter.Splitter("a|b|c|d")
    print s1.orig
    print s1.splitted
#this person expects the default behavior (splitting commas)
from splitter import Splitter

def go():
    s1 = Splitter('a,b,c,d')
    print s1.orig
    print s1.splitted
import a
import b

a.go() #this one sets the global var in splitter
b.go() #this one expects the default behavior
a|b|c|d
['a', 'b', 'c', 'd'] #okay... everything is fine
a,b,c,d
['a,b,c,d'] #not what the programmer expected.. should be split on commas