Python动态属性赋值报错:ValueError: could not convert string to float
解决动态获取对象属性的问题
你之前的问题出在把表达式拼成了字符串字面量,而不是让Python实际执行这个表达式去获取对应的值——所以代码里的var拿到的是"self.data1.close[0]"这个字符串,而不是self.data1.close[0]对应的数值,自然会触发类型转换错误。
Python里动态获取对象属性的标准、安全方式是用getattr()函数,它可以根据字符串形式的属性名,从对象中取出对应的属性。针对你的场景,正确的写法应该是这样:
# 先动态获取self对应的data属性,比如self.data1、self.data0 data_obj = getattr(self, pair.data1) # 再访问该属性的close[0] var = data_obj.close[0]
或者把两行合并成更简洁的形式:
var = getattr(self, pair.data1).close[0]
举个例子,如果pair.data1的值是字符串"data0",那么getattr(self, "data0")就等价于直接写self.data0,之后就能正常访问它的close[0]属性了。
为什么不建议用eval()?虽然eval('self.%s.close[0]' % pair.data1)也能实现,但eval会执行任意字符串代码,存在安全风险(如果pair.data1被注入恶意内容的话),而getattr是专门用来获取属性的,更安全也更符合Python的最佳实践。
内容的提问来源于stack exchange,提问作者blonc
相关产品推荐
相关产品推荐

