Очистка входных данных путем обновления locals () в Python - PullRequest
0 голосов
/ 30 мая 2018

Моя конечная цель - эффективный способ преобразовать все мои числовые входы в числовые массивы и убедиться, что они имеют правильную форму.

Вот поведение, которое я рассматривал:

def test_func(a, b):
    for item in locals():
        new_val = ... # code to sanitize the input 
                      #      (convert to numpy array, reshape, etc.)
        locals().update({item:new_val})

Проблема, конечно, в том, что вы не можете обновлять локальные версии в Python 3.X.Поэтому я думаю, что мой вопрос можно резюмировать следующим образом:

  • Как эффективно дезинфицировать ваши числовые входы (преобразование в числовые массивы / преобразование) при минимизации стандартного кода?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Если вы просто хотите, чтобы все аргументы функции были преобразованы в 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 нетронутым.

0 голосов
/ 30 мая 2018

Ты не.Если вы принимаете столько аргументов, что шаблон очень велик, вы делаете это неправильно.

Вы делаете

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

def test_func(a, b):
    a = santize(a)
    b = santize(b)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...