调用Python自定义数据打乱函数返回None,调整return位置无效如何解决
问题根因
你的函数返回异常的核心原因有3个:
- 条件判断逻辑完全错误:你定义的
is_nested_args是长度为3的列表,直接用if is_nested_args == True判断永远不成立,两个分支都不会进入,sorted_var不会被写入任何内容。如果你调整return位置时误删了函数末尾的return语句,函数执行完没有显式返回就会默认返回None。 - return语句位置错误:你把return写在for循环内部,哪怕条件判断修复了,第一次循环执行完就会直接返回,不会处理剩余的参数。
- 多处语法错误和不合理写法:
- 用到了
inspect、numpy(代码中简写为np),但没有提前导入,运行直接报错 range(np.array(eval(arg_data[i])).shape)中shape是元组,不能直接传给range,需要取对应维度的数值- 用
eval()读取参数的写法非常危险且冗余,完全可以直接把输入参数打包成列表处理,不需要用反射获取参数名再eval
- 用到了
修复后的代码
import random import numpy as np def _shuffle_variables(var, aux_var, label, technique): arg_list = [var, aux_var, label] sorted_var = [] if technique == 'acoustic': is_nested_args = [True, False, False] # 生成打乱的索引 if not is_nested_args[2]: idx_shuffled = list(range(len(label))) random.shuffle(idx_shuffled) else: idx_shuffled = list(range(np.array(label).shape[1])) random.shuffle(idx_shuffled) for i in range(len(arg_list)): current_arg = np.array(arg_list[i]) if is_nested_args[i]: # 嵌套参数按索引打乱 shuffle_result = [] for k in range(current_arg.shape[0]): sort_row = [current_arg[k][j] for j in idx_shuffled] shuffle_result.append(sort_row) sorted_var.append(shuffle_result) else: # 非嵌套参数直接打乱 sort_var = [current_arg[j] for j in idx_shuffled] sorted_var.append(sort_var) return sorted_var # 测试代码 nested_list1 = [[random.random() for x in range(6249)] for x in range(6357)] nested_list2 = [[random.random() for x in range(6249)] for x in range(6357)] var = [random.random() for x in range(6249)] label = [random.random() for x in range(6249)] idx = _shuffle_variables([nested_list1, nested_list2], var, label, 'acoustic')
补充说明
如果需要返回你注释中提到的字典格式,只需要把最后返回的sorted_var换成对应构造的字典即可,不需要用反射获取参数名的冗余写法。
内容的提问来源于stack exchange,提问作者Sunshine
相关产品推荐
相关产品推荐

