通过在Python中更新locals()来清理输入

时间:2018-05-30 08:39:56

标签: python python-3.x numpy

我的最终目标是将所有数字输入转换为numpy数组并确保它们具有正确形状的有效方法。

以下是我正在考虑的行为:

IOException

当然,问题在于您无法在Python 3.X中更新本地人。所以我想我的问题可归纳如下:

  • 如何有效地清理数字输入(转换为numpy数组/重新整形),同时尽量减少样板代码?

2 个答案:

答案 0 :(得分:2)

如果您只是希望函数的所有参数都转换为np.array,那么使用装饰器会非常有帮助。

import numpy as np


def np_decorator(func):
    def wrapper(*args, **kwargs):
        # silently convert arguments to np.array
        new_args = [np.array(x) for x in args]
        new_kwargs = {k: np.array(v) for k,v in kwargs.items()}

        # actual execution when called
        func(*new_args, **new_kwargs)

    return wrapper


@np_decorator
def test_func(a, b):
    print(type(a), type(b))


test_func([2], [5])
# <class 'numpy.ndarray'> <class 'numpy.ndarray'>

虽然我确实认为有时你不需要转换所有的论点。您可以调整装饰器以满足您的需要。例如。仅转换*args但保持**kwargs不变。

答案 1 :(得分:1)

你不是。如果你接受了这么多论证,那么样板很大,你做错了。

你做

def sanitize(x):
    # do sanitation things
    return new_x

def test_func(a, b):
    a = santize(a)
    b = santize(b)