Trigger функции автоматически, если какая-либо функция из списка функций вызываются в Python

голоса
0

Есть ли способ, чтобы вызвать функцию автоматически, если какие-либо из списка функций вызываются в Python?

Как говорят, функция а прикреплена к списку функций [б, в, д, е] и если любой из [б, в, г, е] называется (например, сказать, B ()), то () вызывается автоматически перед этим?

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

Как, например:

# function b is some inbuilt, library function
attach(a, b) #attach function b to function a
b()
# If function b is called first function a gets called, it changes up some 
# global variables for the use of function b, then function b gets executed 

У меня есть некоторые глобальные переменные и некоторые методы класса, глобальные переменные являются нечто вроде КЛАССИФИКАТОРА (например, логистическая регрессия или XGBClassifier), CLASSIFIER_TYPE (например, «линейный» или дерево), которое мне нужно изменить каждый раз я называю нужным и прогнозировать методы их соответствующих трубопроводов ( например pipeline_linear или pipeline_tree) .Поставить / предсказать. Это потому, что я написал такой код:

CLASSIFIER = LogisticRegression
CLASSIFIER_TYPE = 'linear'
pipeline_linear = make_pipeline(preprocessing_pipe, CLASSIFIER())
pipeline_linear.fit(X, y)
CLASSIFIER = XGBClassifier
CLASSIFIER_TYPE = 'tree'
pipeline_tree = make_pipeline(preprocessing_pipe, CLASSIFIER())
pipeline_tree.fit(X, y)
linear_preds = pipeline_linear.predict(X) # This statement throws an error
# because CLASSIFIER and CLASSIFIER_TYPE are not changed
# preprocessing_pipe uses CLASSIFIER_TYPE internally to take care of  
# handling both types of classifiers differently.

Так на основе трубопровода я использую глобальные переменные должны быть внесены соответствующие изменения для того, чтобы приступе и прогнозировать методы работы на трубопроводах (pipeline_linear и pipeline_tree).

Любой другой хороший подход, чтобы заботиться о таких ситуациях будет очень полезно!

Задан 27/11/2018 в 15:07
источник пользователем
На других языках...                            


3 ответов

голоса
2

Используйте оболочку.

Если функция my_functionи ваш список list_of_functions:

def func_wrapper(query):
    for additional_function in list_of_functions:
        # Do whatever you need to do with your list of functions
        additional_function()

    my_function(query)
Ответил 27/11/2018 в 15:10
источник пользователем

голоса
1

Я думаю, что вы все еще можете использовать что-то вроде декоратор / обертку. Смотрите, если что-то подобное может работать для вас:

MY_GLOBAL = 123

def wrap_with_global_value(func, global_val):
    def wrap(*args, **kwargs):
        global MY_GLOBAL
        prev_global_val = MY_GLOBAL
        MY_GLOBAL = global_val
        result = func(*args, **kwargs)
        MY_GLOBAL = prev_global_val
        return result
    return wrap

class MyClass(object):
    def my_func(self):
        global MY_GLOBAL
        print('from my_func: MY_GLOBAL is {}.'.format(MY_GLOBAL))

my_obj = MyClass()
my_obj.my_func = wrap_with_global_value(my_obj.my_func, 456)

print('Before calling my_func: MY_GLOBAL is {}.'.format(MY_GLOBAL))
my_obj.my_func()
print('After calling my_func: MY_GLOBAL is {}.'.format(MY_GLOBAL))

Выход:

Before calling my_func: MY_GLOBAL is 123.
from my_func: MY_GLOBAL is 456.
After calling my_func: MY_GLOBAL is 123.

Вы можете добавить , functools.wrapsесли это для вас важно.

Ответил 27/11/2018 в 16:12
источник пользователем

голоса
0

Конечно, было бы проще просто вызвать функцию в верхней части каждой другой функции?

def setup():
    # Set some variables
    pass

def target1():
    setup()
    pass

def target2():
    setup()
    pass
Ответил 27/11/2018 в 15:11
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more