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

Python TypeError:调用dict.keys()需传入参数的报错求助

问题原因与解决方法

错误根源

你犯了类型注解误用的低级错误:

results_dict = Dict[str, Dict[str, np.ndarray]]

这里的Dict是类型提示工具(从typing导入的注解类),不是用来创建字典实例的构造函数。你把类型本身赋值给了results_dict,而非创建一个空字典对象。当调用results_dict.keys()时,本质是在调用类方法dict.keys()却没传入实例参数,因此触发unbound method错误。

修复步骤

将results_dict的初始化改为创建实际的字典实例,根据需求选择:

1. 创建普通空字典

如果只需基础字典功能:

results_dict: Dict[str, Dict[str, np.ndarray]] = {}

把类型注解放在变量后,用{}生成空字典实例。

2. 使用defaultdict(需自动生成默认值时)

如果后续需要为不存在的键自动生成默认字典:

from collections import defaultdict

results_dict: Dict[str, Dict[str, np.ndarray]] = defaultdict(dict)

额外优化

检查字典键是否存在时,直接用if gate.key in results_dict:比调用keys()更高效(Python字典原生支持成员运算符,无需显式调用keys()),可修改代码为:

if gate.key in results_dict:

修复后的关键代码片段:

def _run(
        circuit: 'AbstractCircuit',
        param_resolver: 'ParamResolver',
        repetitions: int,
    ) -> Dict[str, np.ndarray]:

        # 正确初始化字典并添加类型注解
        results_dict: Dict[str, Dict[str, np.ndarray]] = {}
        values_dict: Dict[cirq.Qid,  int] = defaultdict(int)
        param_resolver = param_resolver or ParamResolver({})
        resolved_circuit = protocols.resolve_parameters(circuit, param_resolver)

        for moment in resolved_circuit:
            for op in moment:
                gate = op.gate

                if isinstance(gate, ops.XPowGate) and gate.exponent == 1:
                    values_dict[op.qubits[0]] = 1 - values_dict[op.qubits[0]]

                elif isinstance(gate, ops.MeasurementGate):
                    qubits_in_order = op.qubits
                    # 直接用in判断键是否存在,更高效
                    if gate.key in results_dict:
                        shape = len(qubits_in_order)
                        current_array = results_dict[gate.key]

内容的提问来源于stack exchange,提问作者beginnerCoder7

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 18:18:17