Python 3.x 将classmethod的返回值赋给init变量
我试图将classmethod的返回值分配给init方法变量,但显示了错误“TypeError:无法解包非iterable非类型对象” 我尝试分配给一个变量,可以看到它返回“tuple”Python 3.x 将classmethod的返回值赋给init变量,python-3.x,Python 3.x,我试图将classmethod的返回值分配给init方法变量,但显示了错误“TypeError:无法解包非iterable非类型对象” 我尝试分配给一个变量,可以看到它返回“tuple” 类端口映射: ip_前缀=[] 定义初始化(self、节点1\u id、节点2\u id): self.node1\u id=node1\u id self.node2\u id=node2\u id self.node1\u ip,self.node2\u ip=port\u mappings.gen\u i
类端口映射:
ip_前缀=[]
定义初始化(self、节点1\u id、节点2\u id):
self.node1\u id=node1\u id
self.node2\u id=node2\u id
self.node1\u ip,self.node2\u ip=port\u mappings.gen\u ip\u prefix()
@类方法
def gen_ip_前缀(cls):
如果len(cls.ip_前缀)==0:
cls.ip_前缀追加(“10.0.0.0/31”)
打印(cls.ip\U前缀)
返回“10.0.0.0/31”、“10.0.0.1/31”
其他:
通过
节点列表=端口映射(“95”、“96”)
因为它返回元组,所以我尝试下面的方法,但是
self.node1_ip,self.node2_ip= port_mappings.gen_ip_prefix()
它显示以下错误
TypeError:无法解压缩不可编辑的非类型对象
我认为问题在于调用
gen\u ip\u prefix()
方法时没有任何参数,因此您的if条件:f len(cls.ip\u prefix)=0:
发现cls
参数是None
,然后在else条件下结束,函数只传递
es而不返回值。这就是为什么会出现TypeError。返回None的原因是您调用gen_ip_前缀两次
类内初始化后,self.node1\u ip,self.node2\u ip=port\u mappings.gen\u ip\u prefix()
然后在第二段代码中的另一次
第一次调用该函数时,它会将cls.ip_前缀视为[]。然后将10.0.0.0/31的条目放入其中,结果是[“10.0.0.0/31”]
这意味着第二次调用函数时,它会看到长度大于零,并转到else语句。由于else语句是函数的结尾(因此您实际上不需要该else),并且在该点上没有定义任何返回值,因此不会返回任何值
None不是iterable(不是元组、列表等),因此不包含可以在
a,b=function()
type语句中解压缩的多个值。iflen(cls.ip\u前缀)!=0
,然后您的函数进入else:pass
并返回None
。嗨,primusa,我还有一些其他代码要放在else块中。首先,我需要从return methodThank Primusa中为这个实例变量赋值,第二次初始化时它碰到了else块。我现在用else块中的一些代码修复了它。谢谢你,Rob,如果你用一个初始化运行它,它会很好地工作。如果你为同一个类添加另一个实例,它会抛出错误node_list=port_mappings(“95”,“96”)print(node_list.\uu dict_u)k=port_mappings(“3”,“4”)print(k.\uu dict_u)实际上你是对的,这让人觉得我在测试代码时没有使用else块,这让我陷入了这个问题。我刚刚在else中添加了一些代码,它正在返回并分配这些值。谢谢你,Rob事实上你是对的,这让人觉得我在测试代码时没有使用else块,这让我陷入了这个问题。我刚刚在else中添加了一些代码,它正在返回并分配这些值。谢谢你,德丽埃