<p>需要什么样的控制?从源代码中可以看到,当您运行<code>pickle.loads(content)</code>时,它实际上是:</p>
<pre><code>def loads(str):
file = StringIO(str)
return Unpickler(file).load()
</code></pre>
<p>还有一些魔力。它将字符串作为文件读取,并根据特定的键发送其内容:</p>
^{pr2}$
<p>加载函数本身:</p>
<pre><code>def load(self):
"""Read a pickled object representation from the open file.
Return the reconstituted object hierarchy specified in the file.
"""
...
read = self.read # self.read = file.read, which is StringIO's read()
dispatch = self.dispatch
try:
while 1:
key = read(1)
dispatch[key](self) # this function call makes a future import.
except _Stop, stopinst:
return stopinst.value
</code></pre>
<p>{{cd2>中使用的是{cd3><cd3}方法:</p>
<pre><code>def find_class(self, module, name):
# Subclasses may override this:
__import__(module) # straight-forward import, you can ovveride it.
mod = sys.modules[module]
klass = getattr(mod, name)
return klass
</code></pre>
<p>例如,<code>load_inst()</code>函数:</p>
<pre><code>def load_inst(self):
module = self.readline()[:-1]
name = self.readline()[:-1]
klass = self.find_class(module, name)
# Now module is imported and ready to be used:
self._instantiate(klass, self.marker())
dispatch[INST] = load_inst
</code></pre>
<p>因此,如果您想控制可以导入的名称空间或模块,则需要子类<code>Unpickler</code>并重写{<cd2>}以满足您的目标。我的回答对你有帮助吗?在</p>