gpt4 book ai didi

python - unpickle python 对象时如何控制导入的内容?

转载 作者:太空宇宙 更新时间:2023-11-03 14:18:56 24 4
gpt4 key购买 nike

我有以下设置:

a.py:

class A(object):
def __init__(self, name):
self.name = name
def a(self):
print('yow {}!'.format(self.name))

b.py:

class B(object):
def __init__(self, obj):
self.obj = obj

sender.py:

from a import A
from b import B
message = pickle.dumps(B(A('Martin')))

receiver.py:

my_b = pickle.loads(message)
my_a = my_b.obj
my_a.a()

输出:yow Martin!

sender.py 中,我 pickle 对象 b,它充当对象 a 的载体。然后我通过 RabbitMQ 将该 pickle 对象 b 发送到另一个进程。在 receiver.py(这是另一个进程)中,我通过 RabbitMQ 收到一条消息,unpickle object b 并通过魔法 BA 自动导入。我可以控制导入的内容吗?我希望 worker receiver.py 消耗尽可能少的内存。但是,如果模块在我无法控制的情况下被导入,它会很快变得臃肿。

谁能解释一下 pickle 如何导入东西以及如何处理它?<​​/p>

最佳答案

需要什么样的控制?正如您从源代码中看到的那样,当您运行 pickle.loads(content) 时,它实际上会执行以下操作:

def loads(str):
file = StringIO(str)
return Unpickler(file).load()

然后有一些魔法。它将字符串作为文件读取,并根据特定键分派(dispatch)其内容:

GLOBAL          = 'c'   # push self.find_class(modname, name); 2 string args
INST = 'i' # build & push class instance

加载函数本身:

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

您对 find_class() 方法很感兴趣,该方法用于其他几个加载函数(load_inst()load_global ()):

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

例如,load_inst()函数:

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

因此,如果您想要控制可以导入的 namespace 或模块,您将需要子类化 Unpickler 并覆盖 find_class() 以符合您的目标。我的回答对您有帮助吗?

关于python - unpickle python 对象时如何控制导入的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30395545/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com