Используйте dict в качестве входных данных для функции, но принимайте только те аргументы, которые нужны функции - PullRequest
0 голосов
/ 11 марта 2020

Я работаю с наукой о данных, и у меня есть довольно большой скрипт, состоящий из множества вспомогательных функций для выполнения анализа на pandas фреймах данных, а затем одна основная функция, которая использует мои функции для получения некоторых результатов.

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

Что меня интересует, так это возможно ли иметь dict, содержащий все мои параметры, и просто передавать dict каждой функции без изменения dict? То есть каждая функция должна была бы игнорировать ключевые слова в dict, которые не являются входными данными для этой конкретной функции.

Чтобы привести пример, скажем, у меня есть эта функция.

    def func1(a, b, c):
        return a + b * c

И у меня есть этот диктат, содержащий входные данные для всех моих функций.

    input_dict = {'a': 1,
                 'b': 2,
                 'c': 3,
                 'd': 4}

Если я вызову эту функцию с этим диктом в качестве ввода, например:

    value = func1(**input_dict)

Я получу ошибку из-за неожиданного аргумента d.

Есть ли обходной путь здесь, который не включает изменение диктата? Мой код работает, но я бы хотел избежать повсеместного повторения входных аргументов.

Заранее спасибо :)

1 Ответ

0 голосов
/ 11 марта 2020

Что мне интересно, возможно ли иметь dict, содержащий все мои параметры, и просто передавать dict каждой функции без изменения dict?

Это довольно хорошее резюме варианта использования для класса.

from operator import attrgetter


class Foo:
    def __init__(self, a, b, c, d):
        self.a = a
        self.b = b
        self.c = c
        self.d = d

    def func1(self):
        a, b, c = attrgetter('a', 'b', 'c')(self)
        return a + b * c

f = Foo(1, 2, 3, 4)

value = f.func1()

Экземпляр вашего класса заменяет input_dict. Каждая вспомогательная функция становится методом экземпляра, в определении которого используются только те атрибуты экземпляра, которые ей необходимы.

Мое использование attrgetter - это всего лишь предложение для помощи в переносе существующих функций в методы, поскольку для этого не требуется разбросать кучу ссылок на self по всему. Вы можете определить func1 просто как

def func1(self):
    return self.a + self.b * self.c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...