2010-09-11 22 views
7

मुझे एक निश्चित मॉड्यूल में एक फ़ंक्शन मिला है जिसे मैं परीक्षण उद्देश्यों के लिए रनटाइम पर (माक) को फिर से परिभाषित करना चाहता हूं। जहां तक ​​मैं समझता हूं, फ़ंक्शन परिभाषा पायथन में असाइनमेंट से अधिक कुछ नहीं है (मॉड्यूल परिभाषा स्वयं ही एक प्रकार का फ़ंक्शन निष्पादित किया जा रहा है)। जैसा कि मैंने कहा, मैं इसे एक परीक्षण मामले के सेटअप में करना चाहता हूं, इसलिए किसी अन्य मॉड्यूल में फ़ंक्शन को फिर से परिभाषित किया जाना चाहिए। ऐसा करने के लिए वाक्यविन्यास क्या है?मैं अजगर में फ़ंक्शंस को फिर से परिभाषित कैसे करूं?

import module1 

module1.func1 = lambda x: return True 
+2

पर वापस जाने के लिए वापस जायेगा आपको 'lambda' में' वापसी 'की आवश्यकता नहीं है। 'module1.func1 = lambda x: True' काम करना चाहिए। – sastanin

उत्तर

9
import module1 
import unittest 

class MyTest(unittest.TestCase): 
    def setUp(self): 
     # Replace othermod.function with our own mock 
     self.old_func1 = module1.func1 
     module1.func1 = self.my_new_func1 

    def tearDown(self): 
     module1.func1 = self.old_func1 

    def my_new_func1(self, x): 
     """A mock othermod.function just for our tests.""" 
     return True 

    def test_func1(self): 
     module1.func1("arg1") 

नकली बहुत सारे आईएनजी पुस्तकालय इस तरह के मॉकिंग करने के लिए उपकरण प्रदान करते हैं, आपको उनकी जांच करनी चाहिए क्योंकि आपको उनकी मदद से काफी मदद मिलेगी।

+0

क्या आप जानते हैं कि मैं बंद करने के द्वारा फ़ंक्शन को फिर से परिभाषित कर सकता हूं? –

+0

आप अपने उदाहरण में किए गए लैम्ब्डा का भी उपयोग कर सकते हैं, यह एक विधि नहीं है। –

2

बस एक नया कार्य या पुराने नाम को लैम्ब्डा आवंटित: उदाहरण के लिए, 'module1' मेरे समारोह, मेरे testcase में मैं इस (कोई सफलता) की कोशिश की है है मेरी मॉड्यूल और 'func1' है

>>> def f(x): 
...  return x+1 
... 
>>> f(3) 
4 
>>> def new_f(x): 
...  return x-1 
... 
>>> f = new_f 
>>> f(3) 
2 

यह भी काम करता है जब एक समारोह एक और मॉड्यूल से है:

### In other.py: 
# def f(x): 
# return x+1 
### 

import other 

other.f = lambda x: x-1 

print other.f(1) # prints 0, not 2 
+0

जैसा कि मैंने कहा, फ़ंक्शन किसी अन्य मॉड्यूल में है, मेरे संपादन की जांच करें। –

+0

यह वही काम करता है। मैंने जवाब अपडेट किया। – sastanin

3
import foo 

def bar(x): 
    pass 

foo.bar = bar 
+0

सरल और सर्वोत्तम समाधान। – Depado

1

आप दुभाषिया फ़ाइल foo.py कि आप संपादन कर रहे में फिर से लोड करना चाहते हैं, तो आप एक साधारण-से-प्रकार समारोह और उपयोग execfile() कर सकते हैं, लेकिन मैं सिर्फ इतना है कि यह काम नहीं करता सीखा सभी कार्यों (दुर्भाग्य से) की वैश्विक सूची के बिना, जब तक कि कोई एक बेहतर विचार है:

फ़ाइल foo.py में कहीं न कहीं:

def refoo(): 
    global fooFun1, fooFun2 
    execfile("foo.py") 

अजगर दुभाषिया में:

refoo() # अब आप foo.py से अपने नवीनतम संपादन है

2

उपयोग redef: http://github.com/joeheyming/redef

import module1 
from redef import redef 

rd_f1 = redef(module1, 'func1', lambda x: True) 

rd_f1 दायरे से बाहर चला जाता है या हटा दी जाती है , func1 वापस सामान्य

+0

मैंने सोचा कि रेफ-गिनती गुंजाइश एक सीपीथॉन चीज थी, और इस तरह की चीज अन्य प्लेटफॉर्म (पीपीपी, ज्योथन, आयरनपीथन) पर काम नहीं करेगी। – leewz

+0

सभी रेडिफ करता है एक फ़ंक्शन या विशेषता को एक नए फ़ंक्शन/विशेषता के साथ लपेटता है। जब वस्तु दायरे से बाहर हो जाती है, तो __delete__ फ़ंक्शन को कॉल किया जाता है, जो पुराने फ़ंक्शन/विशेषता का उपयोग करने के लिए फ़ंक्शन घोषणा को वापस कर देता है। यह एक गिनती गुंजाइश की तरह चीज नहीं है। –

+0

लेकिन "ऑब्जेक्ट को संकेत दिया जाता है जब यह गुंजाइश से बाहर हो जाता है" का विचार सीपीथन रेफ-गिनती पर निर्भर है, नहीं? उदाहरण के लिए, पीपीपी में, जब एक फ़ाइल ऑब्जेक्ट का वैरिएबल गुंजाइश से बाहर हो जाता है, तो वस्तु तुरंत कचरा-संग्रह नहीं होती है, इसलिए जब तक संग्राहक निर्णय लेता है तब तक फ़ाइल बंद नहीं होती है। – leewz

संबंधित मुद्दे