如何从Python访问Solidity结构体中的数组元素?
解决Python访问Solidity结构体数组指定位置的问题
核心思路
Solidity结构体中的数组在Python(以Web3.py为例)中会被解析为Python列表,直接通过下标[]即可访问指定位置元素。你遇到的'wei' object is not callable报错,通常是误用括号()访问下标导致的。
具体操作步骤
假设你的合约有一个返回Data结构体的view函数,比如function getData(uint256 id) external view returns (Data memory):
获取完整结构体数据
# 调用合约函数获取结构体实例 data = contract.functions.getData(1).call()提取数组并访问指定元素
结构体元素按Solidity定义的顺序映射为Python元组,holdersArray是第4个元素(索引从0开始):# 提取holdersArray数组 holders_array = data[3] # 访问数组的第1个元素(索引0) first_holder = holders_array[0] # 打印结果 print(first_holder)
更高效的方式:直接读取数组指定元素
如果合约提供单独读取数组元素的函数(推荐这种方式,避免传输整个数组),比如:
function getHolder(uint256 id, uint256 index) external view returns (address) { return dataMap[id].holdersArray[index]; }
在Python中直接调用该函数:
# 读取id为1的Data中holdersArray的第1个元素 target_holder = contract.functions.getHolder(1, 0).call()
报错原因说明
'wei' object is not callable一般是因为你错误地用括号()访问数组下标(比如写成holdersArray(0)),正确的数组下标访问应该用方括号[]。另外也可能是将数值类型的返回值当作函数调用,检查代码中是否有类似语法错误。
内容的提问来源于stack exchange,提问作者Jose Maria
相关产品推荐
相关产品推荐

