对于我正在处理的脚本,我希望使其可选,以将数组传递给函数。我尝试执行此操作的方法是将相关变量(residue
)设置为kwarg
。
问题是,当我以这种方式执行操作时,python将kwarg的dtype从numpy.ndarray
更改为dict
。最简单的解决方案是使用以下方法将变量转换回np.array
:
residue = np.array(residue.values())
但是我觉得这不是一个非常优雅的解决方案。因此,我想知道是否有人可以向我展示“更漂亮”的方式来完成此任务,并可能向我解释为什么python这样做?
有问题的功能是:
#Returns a function for a 2D Gaussian model
def Gaussian_model2D(data,x_box,y_box,amplitude,x_stddev,y_stddev,theta,**residue):
if not residue:
x_mean, y_mean = max_pixel(data) # Returns location of maximum pixel value
else:
x_mean, y_mean = max_pixel(residue) # Returns location of maximum pixel value
g_init = models.Gaussian2D(amplitude,x_mean,y_mean,x_stddev,y_stddev,theta)
return g_init
# end of Gaussian_model2D
使用以下命令调用该函数:
g2_init = Gaussian_model2D(cut_out,x_box,y_box,amp,x_stddev,y_stddev,theta,residue=residue1)
我正在使用的Python版本是2.7.15
答案 0 :(得分:0)
请参见the accepted answer here,如果您通过dict
传递参数,为什么总是 得到一个映射对象(又称**kwargs
); the language spec says:
如果存在形式“ ** identifier”,则将其初始化为新的 有序映射接收任何多余的关键字参数,默认为 一个新的相同类型的空映射。
换句话说,您描述的行为正是该语言所保证的。
此行为的原因之一是,基础语言(例如C / J)中的所有函数,包装程序和实现都将理解**kwargs
是参数的一部分,应将其扩展为-值组合。
如果要将额外参数保留为某种类型的对象,则不能使用**kwargs
来这样做。通过一个明确的参数传递它,例如extra_args
,没有特殊含义。