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
相关产品推荐
相关产品推荐

