【问题标题】:How do I keep the dtype intact of a kwarg?如何保持 kwarg 的 dtype 完整?
【发布时间】:2019-04-22 03:18:37
【问题描述】:

对于我正在处理的脚本,我想让它成为可选的,以将数组传递给函数。我尝试执行此操作的方法是将有问题的变量 (residue) 设为kwarg

问题是,当我以这种方式执行此操作时,python 将 kwarg 的 de 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

【问题讨论】:

  • 可选参数不是这样工作的。
  • def Gaussian_model2D(data, x_box, y_box, amplitude, x_stddev, y_stddev, theta, residue=None):
  • dtype 不能是dict...
  • 使residue 成为一个可选 参数,类似于def foo(residue=None) 然后检查if residue is not None: ... do stuff with residue
  • 使用residue = None 编译时出现以下错误:ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

标签: python python-2.7 dictionary keyword-argument numpy-ndarray


【解决方案1】:

如果您通过**kwargs 传递参数,请参阅the accepted answer here 为什么您总是得到一个映射对象(又名dict); the language spec says:

如果存在“**identifier”形式,则将其初始化为新的 接收任何多余关键字参数的有序映射,默认为 一个新的相同类型的空映射。

换句话说,你描述的行为正是语言所保证的。

这种行为的一个原因是底层语言(例如 C/J)中的所有函数、包装器和实现都将理解 **kwargs 是参数的一部分,应该扩展为它的键值组合. 如果您想将额外参数保留为某种类型的对象,则不能使用**kwargs 来执行此操作;通过显式参数传递它,例如extra_args 没有特殊含义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-26
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多