You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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):

  1. 获取完整结构体数据

    # 调用合约函数获取结构体实例
    data = contract.functions.getData(1).call()
    
  2. 提取数组并访问指定元素
    结构体元素按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 20:57:17