как передать ** Kwargs в функцию из метода класса - PullRequest
0 голосов
/ 12 февраля 2020

Мне нужно создать собственный класс преобразователя для конвейера машинного обучения. testfun на самом деле является функцией R, доступ к которой осуществляется через rpy2. testfun затем используется внутри класса test. Я хочу раскрыть все аргументы функции R, представленной testfun, следовательно, **kwargs. Но я не знаю, как пройти **kwargs. Код ниже выдает ошибку.

def testfun(x=1, a=1, b=1, c=1):
    return x**a, b**c

class test(BaseEstimator, TransformerMixin):
    def __init__(self, **kwargs):
        self.__dict__.update(**kwargs)
    def testkwargs(self):
        return testfun(**kwargs)
temp = test(x=1,a=1,b=2,c=3)
temp.testkwargs()

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-131-de41ca28c280> in <module>
      5         return testfun(**kwargs)
      6 temp = test(x=1,a=1,b=2,c=3)
----> 7 temp.testkwargs()

<ipython-input-131-de41ca28c280> in testkwargs(self)
      3         self.__dict__.update(**kwargs)
      4     def testkwargs(self):
----> 5         return testfun(**kwargs)
      6 temp = test(x=1,a=1,b=2,c=3)
      7 temp.testkwargs()

NameError: name 'kwargs' is not defined

Заранее спасибо!

РЕДАКТИРОВАТЬ: изменения в соответствии с ранними предложениями не очень помогли

class test(BaseEstimator, TransformerMixin):
    def __init__(self, **kwargs):
        self.__dict__.update(**kwargs)
    def testkwargs(self, **kwargs):
        return testfun(**kwargs)
temp = test(x=2,a=1,b=2,c=3)
temp.testkwargs()

Вывод:

 (1, 1)

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Здесь вы можете сделать это так.

def testfun(x=1, a=1, b=1, c=1):
    return x**a, b**c

class test():
    def __init__(self, **kwargs):
        self.__dict__.update(**kwargs)
        self.kwargs = kwargs
    def testkwargs(self):
        return testfun(**self.kwargs)

temp = test(x=1,a=1,b=2,c=3)
temp.testkwargs()
0 голосов
/ 12 февраля 2020

Ваша тестовая функция должна быть такой ...

def testfun(**kwargs):
    ... fetch each value using loop or similar...

Вызовите testfun вот так ..

testfun(a=1,b=2...)
...