具有过多参数的函数 - Python

时间:2013-07-18 12:39:21

标签: python function args

,我目前正在创建一个遗传模糊学习系统,它是相应的训练模拟环境 - >这个函数和类的集合由一个主脚本控制,用户可以在其中定义以下内容:模拟场景,控制器特性等。

结果是大约50个不同的numpy数组和列表作为我的特定问题的参数。必须将这些参数赋予控制器生成函数,以及确定每个控制器有效性的模拟。此过程当前使用multiprocess.starmap_async方法来并行化每个控制器的适应性。所以我的主脚本用大约50个参数调用控制器生成,多进程调用它的工作者有大约55个进程,工作者用57个输入调用所有模拟文件。 (我目前的理解是,对多进程使用这么多输入参数不会增加开销,因为它们只是指向数据的名称,而不是复制或重新初始化...如果我错了请告诉我!)

我知道我可以用一个包含所有参数的列表替换我的50个参数,并且我可以在我的主脚本中使用全局变量来避免必须完成所有这些簿记。很多这些变量都没有改变,但是我不想多次计算的大型数据结构。是否有其他方法,哪一种被认为是最可接受的?我希望避免在我的项目中每次调用任何10行args。

尽可能残酷,一切都运行得很好,但我的模拟只会变得越来越复杂,(非可选)参数的数量越来越多。 我删除了所有更具体的var名称,但这是一个我的主脚本运行的调用:

    (opt_str,opt_fit) = Trainer(map_size,Targets,SAMS,SAMS_stat,AIS,AIS_stat,
                          B_mpammo,B_sdammo,Route,vel,B_range,A_range, S_range,B_flight,
                          A_flight, S_flight,... lots more)

在我的GA中,我有:

        step = np.int8(pop_size/8)
        pol = Pool(processes=8)

        res = pol.starmap_async(SimWorker, ((i, i+step, map_size,Targets,
                                SAMS,SAMS_stat,AIS,AIS_stat,
                                B_mpammo,B_sdammo,Route,vel,B_range,
                                A_range,S_range,B_flight,
                                A_flight, S_flight,fitness,
                                ttr,ttb,ttcr,ttcb,pos,times,pop,... lots more args) for i in range(0, pop_size, step)))

和SimWorker:

for p in range(start, stop):
    fitness[p] = Sim_T(map_size,Targets,SAMS,SAMS_stat,AIS,AIS_stat,
                            B_mpammo,B_sdammo,Route,vel,B_range,A_range,S_range,B_flight,
                            A_flight, S_flight,
                            ttr,ttb,ttcr,ttcb,pos,times,pop[p],... lots more)

2 个答案:

答案 0 :(得分:1)

在面向对象编程意义上,你绝对应该将所有这些参数封装到一个对象中。这个对象是一个简单的字典还是一个更高级的对象是一个应该谨慎考虑的设计问题。我们当然需要更多信息来提供更具体的答案。

答案 1 :(得分:0)

如果您使用关键字参数,又名**kwargs,那么您只能根据需要传入,而不需要您不需要的参数。然后,您的功能可以检查并获取它想要的功能。

或者,创建一个表示状态的对象(我建议一个类),然后构建它并将其传递给函数。