एक समारोह के कार्यों की एक सूची के किसी भी समारोह अजगर में कहा जाता है स्वचालित रूप से अगर गति प्रदान

वोट
0

वहाँ एक समारोह स्वचालित रूप से अगर कार्यों की एक सूची में से किसी अजगर में कहा जाता है को गति प्रदान करने के लिए एक रास्ता है?

जैसा कहते हैं कि समारोह एक कार्यों [बी, सी, डी, ई] की एक सूची से जुड़ा हुआ है और की [बी, सी, डी, ई] या तो कहा जाता है, तो (उदाहरण के लिए कहते हैं कि ख ()) तो एक () स्वचालित रूप से कहा जाता है इससे पहले?

मैं समारोह एक का उपयोग करने के पहले ख ताकि ख उपयोग कर सकते हैं कहा जाता है कुछ मान सेट करना चाहते हैं।

जैसे उदहारण के लिए:

# 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 

मैं कुछ वैश्विक चर और कुछ वर्ग के तरीकों है, वैश्विक चर वर्गीकारक की तरह somethings (जैसे LogisticRegression या 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