Cryptopals第1套第6题Python代码int不可调用及str异或报错求解
第一个报错(TypeError: 'int' object is not callable)原因
你在代码其他位置定义了名为sum的变量,覆盖了Python内置的sum()函数,导致hammingDistance中调用sum()时实际触发了对整数类型的调用,因此报错。
单独测试时该代码能正常运行,是因为单独测试场景下sum变量的定义位置在hammingDistance函数定义之后,函数调用的还是原生内置函数,因此没有触发冲突。
第二个报错(TypeError: unsupported operand type(s) for ^: 'str' and 'str')修复方案
该报错说明传入hammingDistance的两个参数实际为字符串类型,并非你预期的字节类型,排查和修复步骤如下:
- 避免使用
sum作为变量名,同时可以简化汉明距离的计算逻辑,规避对sum函数的依赖:
def hammingDistance(binary_seq_1, binary_seq_2): # 计算两个字节串的汉明距离 assert len(binary_seq_1) == len(binary_seq_2) dist = 0 for b1, b2 in zip(binary_seq_1, binary_seq_2): diff = b1 ^ b2 # 直接使用count方法统计1的个数,无需调用sum函数 dist += bin(diff).count('1') return dist
- 检查
createChunks函数的调用逻辑,确认传入的参数确实是b64decode返回的字节类型密文,避免在分片过程中意外将字节转换为字符串。 - 若需要进一步定位类型异常,可以在函数开头增加类型校验逻辑:
def hammingDistance(binary_seq_1, binary_seq_2): # 新增类型校验,参数类型不符合时直接抛出明确报错 assert isinstance(binary_seq_1, bytes) and isinstance(binary_seq_2, bytes), "参数必须为字节类型" assert len(binary_seq_1) == len(binary_seq_2) # 剩余逻辑不变
内容的提问来源于stack exchange,提问作者NotQuiteSo1337
相关产品推荐
相关产品推荐

