修饰函数以接受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将返回默认情况下未经修改的函数值。但是,在某些情况下,我们可能希望单独返回 data
, wcs
,等等。如果这些单独传入,则 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):
...