Python属性赋值报错:预期解包3个值却得到1个(元组含3元素)
问题原因分析
你遇到的问题核心在于setter方法里的*args参数和你传递元组的方式不匹配。
当你定义def data(self, *args)时,*args的作用是把调用时传入的多个独立参数打包成一个元组。但你现在直接把一个三元组test作为单个参数传进去,Python就会把这个整个元组当成args的唯一元素——也就是说,args实际上是(test,),长度是1,自然没办法解包成3个变量,这就是报错expected 3, got 1的原因。
举个简单例子验证这个逻辑:
def func(*args): print(args) test = (1,2,3) func(test) # 输出:((1, 2, 3),) func(*test) # 输出:(1, 2, 3)
两种解决方案
方案1:修改赋值时的传参方式,解包元组
不用直接传整个元组,而是用*把元组拆成三个独立参数传给setter:
self.image5d.data = *test, # 或者更直观的写法 self.image5d.data = test[0], test[1], test[2]
这样args就会是(image_temp, np.uint8, sizes),长度为3,就能正常解包了。
方案2:修改setter的参数定义,直接接收三元组
如果你的设计就是希望data属性接收一个三元组作为值,那应该把setter的参数改成直接接收单个值,然后在方法内部解包:
@data.setter def data(self, value): image_array, dtype, sizes = value if image_array is None: self._data = np.empty(sizes, dtype) else: self._data = np.array(image_array, dtype) self._set_color_data()
这样你原来的赋值方式self.image5d.data = test就能正常工作了,因为value会直接拿到那个三元组,解包成三个变量。
内容的提问来源于stack exchange,提问作者Bjarne Thorsted
相关产品推荐
相关产品推荐

