2010-02-17 23 views
9

मैं अच्छा वाक्य रचना के साथ समारोह रचना को लागू करने की कोशिश की और यहां की है कि मैं क्या मिल गया है है:अजगर समारोह रचना

from functools import partial 

class _compfunc(partial): 
    def __lshift__(self, y): 
     f = lambda *args, **kwargs: self.func(y(*args, **kwargs)) 
     return _compfunc(f) 

    def __rshift__(self, y): 
     f = lambda *args, **kwargs: y(self.func(*args, **kwargs)) 
     return _compfunc(f) 

def composable(f): 
    return _compfunc(f) 

@composable  
def f1(x): 
    return x * 2 

@composable 
def f2(x): 
    return x + 3 

@composable 
def f3(x): 
    return (-1) * x 

print f1(2) #4 
print f2(2) #5 
print (f1 << f2 << f1)(2) #14 
print (f3 >> f2)(2) #1 
print (f2 >> f3)(2) #-5 

यह पूर्णांकों के साथ ठीक काम करता है, लेकिन पर सूचियों/tuples विफल रहता है:

@composable 
def f4(a): 
    a.append(0) 

print f4([1, 2]) #None 

कोई गलती कहां है?

+0

मुझे लगता है कि "को कुचला" क्या आपका मतलब द्वारा "दुर्घटनाओं"? और "दुर्घटनाओं" से मुझे लगता है कि आपका मतलब है "अपवाद फेंकता है"? साथ ही, यदि मैंने आपके द्वारा पोस्ट किया गया सटीक कोड चलाया है, तो यह ठीक काम करता है। – porgarmingduod

+1

मैं यह देखने में असफल रहा कि कैसे f4() 'डिज़ाइन के रूप में काम नहीं कर रहा है। शायद आपको गलत उम्मीदें हैं। –

+0

धन्यवाद, इग्नासिओ। मैंने वास्तव में बेवकूफ गलती की है। – si14

उत्तर

9

append करता है यथा-स्थान इसके अलावा, के रूप में इग्नेसियो वेज़क्वेज़-अब्राम ने कहा कि (अच्छी तरह से, निहित) - हां, जब तुम ठीक हो सकता है कि सिर्फ अपने कार्य करने के लिए एक return जोड़कर, इसे बदलने के पक्ष प्रभाव होता है तर्क यह पारित किया गया था, भी:

@composable 
def f4(a): 
    a.append(0) 
    return a 

यह और भी संक्षिप्त कोड जो भी बनाता है और एक नया ऑब्जेक्ट निम्नलिखित का उपयोग करने के लिए सबसे अच्छा होगा:

@composable 
def f4(a): 
    return a + [0] 
+0

धन्यवाद। मेरी गलती भयानक है। – si14

+1

हम केवल मानव हैं :) – badp

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