修饰函数以接受NDData对象#

这个 astropy.nddata 模块包括一个装饰器 support_nddata() 这使得开发人员和用户可以方便地编写可以接受的函数 NDData 对象和单独的参数。

考虑以下函数:

def test(data, wcs=None, unit=None, n_iterations=3):
    ...

现在假设我们希望能够将函数 test(nd) 在哪里? nd 是一个 NDData 实例。我们可以用这个函数来装饰 support_nddata() ::

from astropy.nddata import support_nddata

@support_nddata
def test(data, wcs=None, unit=None, n_iterations=3):
    ...

这样当用户调用 test(nd) ,则函数将自动调用:

test(nd.data, wcs=nd.wcs, unit=nd.unit)

decorator查看函数的签名并检查是否有任何参数也是 NDData 对象,并将它们作为单个参数传递。也可以使用单独的参数调用函数,就好像它没有经过修饰一样。

如果 NDData 属性已设置,但函数不接受它-例如,如果 wcs 已设置,但函数无法支持WCS对象。另一方面,如果函数中的参数不存在于 NDData 对象或未设置,则保留其默认值。

如果函数调用成功,则decorator将返回默认情况下未经修改的函数值。但是,在某些情况下,我们可能希望单独返回 datawcs ,等等。如果这些单独传入,则 NDData 否则请实例。为此,可以指定 repack=True 并提供函数的输出参数的名称列表:

@support_nddata(repack=True, returns=['data', 'wcs'])
def test(data, wcs=None, unit=None, n_iterations=3):
    ...

这样,函数将返回单独的值,如果 test 使用单独的参数调用,如果输入是 NDData 或子类实例。

最后,可以让decorator将输入限制为 NDData 使用 accepts 选项:

@support_nddata(accepts=CCDImage)
def test(data, wcs=None, unit=None, n_iterations=3):
    ...