Python代码中cars类为何被两次调用?元组末尾逗号作用是什么?
问题解答
原代码示例
import copyreg, pickle class cars: def __init__(self, name): self.name = name def myfunc(x): return cars , (x.name,) copyreg.pickle(cars, myfunc) test = cars('hello') print(pickle.dumps(test))
问题1:cars类为何会被两次引用?myfunc中为何还要返回cars类?
copyreg.pickle(cars, myfunc) 只是告诉pickle:当序列化cars类的实例时,调用myfunc来处理。而myfunc的核心职责是告诉pickle:反序列化时,用什么构造器、什么参数来重建这个对象。
这里返回的cars就是重建对象的构造器(Python里类本身可调用,调用后生成实例),后面的元组是传给构造器的参数。注册时传cars是指定要处理的目标类,myfunc里返回cars是指定重建对象的具体方式,二者作用完全不同,缺一不可。
问题2:元组(x.name,)中的逗号有什么作用?
这是Python定义单元素元组的关键语法。如果只写(x.name),那只是被括号包裹的普通表达式,结果就是x.name的原始值;加上逗号后,才会被识别为仅包含一个元素的元组。
因为pickle要求构造器的参数必须以元组形式传递,所以必须用逗号明确这是一个元组,否则反序列化时会因参数格式不匹配报错。
内容的提问来源于stack exchange,提问作者user20987481
相关产品推荐
相关产品推荐

