是否有标准化的装饰器用于在函数参数上应用asarray
?
即。我可以写的东西:
@array_args # this decorator automatically calls asarray on arguments
def f(x,y):
return x/y
而不是
def f(x,y):
(x,y)=(numpy.asarray(x), numpy.asarray(y))
return x/y
我只发现了这个discussion,所以我可以把装饰器拉到那里;但是我
更喜欢使用已集成到numpy
。
答案 0 :(得分:4)
AFAIK它不存在,但写一个很简单:
from functools import wraps
def array_args(func):
@wraps(func)
def wrapper(*args):
arrays = map(np.asarray, args)
return func(*arrays)
return wrapper
答案 1 :(得分:1)
这就是我最终的结果,
import scipy # numpy could work too
from functools import wraps
def asarray_strictnumeric( obj ):
''' only convert if the result is a numerical array. '''
tmp=scipy.asarray(obj)
if tmp.dtype.kind in 'iufc':
return tmp
else:
return obj
def array_args(f):
''' Decorator:
- converts numerical positional arguments to arrays,
- leaves non-numerical positional arguments alone,
- leaves all keywords alone.
'''
@wraps(f)
def wrapper(*args, **kwds):
args=[asarray_strictnumeric(x) for x in args]
return f( *args, **kwds )
return wrapper
但@promanow的答案是一个有用的起点。