【发布时间】:2014-05-01 06:37:49
【问题描述】:
我对 python 函数装饰器有点了解。我认为我的问题的答案是否定的,但我想确定一下。使用装饰器和 x = np.array([1,2,3]) 的 numpy 数组,我可以覆盖 x.sqrt() 并更改行为。有什么方法可以在 Python 中覆盖 np.sqrt(x)?
用例:处理quantities package。希望能够在不更改当前使用 np.sqrt() 的代码库的情况下取不确定数量的平方根。
编辑:
我想修改quantities 包中的np.sqrt 以便下面的代码可以工作(所有三个都应该打印相同的结果,注意使用np.sqrt() 时的0 不确定性)。我希望不要求最终用户修改他们的代码,但在quantities 包中正确包装/装饰np.sqrt()。目前,许多 numpy 函数都经过修饰(参见 https://github.com/python-quantities/python-quantities/blob/ca87253a5529c0a6bee37a9f7d576f1b693c0ddd/quantities/quantity.py),但似乎仅在调用 x.func() 时才有效,而不是 numpy.func(x)。
import numpy as np
import quantities as pq
x = pq.UncertainQuantity(2, pq.m, 2)
print x.sqrt()
>>> 1.41421356237 m**0.5 +/- 0.707106781187 m**0.5 (1 sigma)
print x**0.5
>>> 1.41421356237 m**0.5 +/- 0.707106781187 m**0.5 (1 sigma)
print np.sqrt(x)
>>> 1.41421356237 m**0.5 +/- 0.0 dimensionless (1 sigma)
【问题讨论】:
-
装饰器应用于函数定义而不是函数调用。如果函数已经定义,那么使用装饰器就太晚了(尽管您可以通过将包装函数分配给原始名称来实现相同的效果)。你能展示一个实际的代码示例来说明你想要做什么以及想要的效果吗?
-
提供的示例。我想包装 np.sqrt() (和 np.mean 等),以便它与数量包一起使用。大多数函数都有,但有些没有。
标签: python numpy decorator python-decorators