Превращение функции Python в класс без нарушения API - PullRequest
0 голосов
/ 15 апреля 2019

Итак, я создал библиотеку python для вычисления метрик ошибок между временными рядами ( здесь ).Когда я впервые создавал библиотеку, я был начинающим программистом с почти нулевым предыдущим опытом, поэтому для каждой метрики ошибки я просто писал ее как функцию.Сегодня я подумал, что было бы неплохо, если бы каждая метрика ошибки была представлена ​​как класс, чтобы пользователь мог сделать что-то вроде следующего.

# Name of the package
import HydroErr as he

he.r_squared.description  # Would return out a brief metric description

Я бы хотел сохранить синтаксис старого API нетронутым, илиэто сломало бы весь унаследованный код.Это должно было бы выглядеть примерно так, когда имитируются и передаются данные наблюдений.

import HydroErr as he
import numpy as np

he.r_squared(np.array([1, 2, 3]), np.array([1.1, 1.21, 1.3]))
# Out: 0.9966777408637874

Я не совсем уверен, как это сделать, и что более важно, если я должен это сделать.Любая помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 15 апреля 2019

Чтобы превратить функцию в класс, вы можете использовать метод __call__:

def function(param):
    pass

# Becomes

class MyClass:
    def __call__(self, param):
        pass

    def other_method(self):
        pass

function = MyClass()

Оба могут использоваться следующим образом: function(42)

1 голос
/ 15 апреля 2019

У вас нет , чтобы превратить функции в классы, чтобы это работало:

def r_squared(x, y):
    """ Do things... """
    return 56
r_squared.description = r_squared.__doc__

Вы можете написать декоратор, если таких функций много:

def add_description(fn):
    fn.description = fn.__doc__

@add_description
def r_squared(x, y):
    """ Do things... """
    return 56
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...