2009-05-04 13 views
5

मैं https://storm.canonical.com/Tutorial में तूफान ORM के ट्यूटोरियल पढ़ा है, और मैं कोड का निम्न भाग पर ठोकर खाई:इस कोड में कौन सी पायथन सुविधा सचित्र है?


store.find(Person, Person.name == u"Mary Margaret").set(name=u"Mary Maggie") 

मुझे यकीन है कि का दूसरा तर्क लगता है कि विधि के लिए सही/गलत मूल्यांकन किया जाएगा नहीं कर रहा हूँ। मुझे लगता है कि इसे लैम्ब्डा के रूप में व्याख्या किया जाएगा। यदि यह सच है, तो मैं अपने कार्यों में एक ही प्रभाव कैसे प्राप्त कर सकता हूं?

उत्तर

0

क्योंकि मैं जावा प्रोग्रामर हूं ... मैं अनुमान लगा रहा हूं ... यह ऑपरेटर ओवरलोडिंग है? Person.name == एक ऑपरेटर अतिभारित कि बजाय तुलना करना है ... यह एक SQL क्वेरी

पैदा करता है मेरी 0.02 $

+0

जावा और ऑपरेटर ओवरलोडिंग ... ऐसा नहीं लगता कि यह कभी भी सच होगा। दूसरी ओर, शायद आप सही हैं। – Geo

+10

विषम .... एक "अनुमान" उत्तर स्वीकार करते समय एक और उत्तर तूफान में वास्तविक स्रोत कोड पर आधारित होता है। –

+0

क्षमा करें, लेकिन मेरा अनुमान "पर्याप्त तेज़" था :-) पीएस आप सही हैं, यह बहुत अजीब है! – dfa

1

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

पाइथन लैम्ब्डा कार्यों के बारे में अधिक जानने के लिए के उत्कृष्ट chapter पढ़ें।

+0

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

22

Person.name में __eq__ विधि अधिभारित है जो एक बूलियन मान नहीं देता है लेकिन एक ऑब्जेक्ट जो अभिव्यक्ति के दोनों किनारों को संग्रहीत करता है; उस वस्तु को find() विधि द्वारा विशेषता और मूल्य प्राप्त करने के लिए जांच की जा सकती है जिसे फ़िल्टरिंग के लिए उपयोग किया जाएगा। मैं इसे एक आलसी मूल्यांकन पैटर्न के रूप में वर्णित करता हूं।

तूफान में, इसे Comparable object के साथ लागू किया गया है।

8

जादू व्यक्ति.नाम संपत्ति में है, जिसके परिणामस्वरूप __eq__ (& सी) ओवर-लोड करता है जो गैर-बूल लौटाता है। तूफान के सूत्रों ऑनलाइन आप ब्राउज़ करना के लिए कर रहे हैं (और सावधानी से नकल ;-) http://bazaar.launchpad.net/~storm/storm/trunk/files/head%3A/storm/ पर - के रूप में आप देखेंगे, वे "काला जादू" ;-)

9

Person.name पर प्रकाश मत जाओ कुछ का एक उदाहरण है एक कस्टम __eq__ विधि के साथ टाइप करें। जबकि __eq__ आमतौर पर एक बूलियन (आईएसएच) मान देता है, यह वास्तव में जो भी आप चाहते हैं उसे लौटा सकता है, जिसमें लैम्ब्डा भी शामिल है। इस और संबंधित विधियों पर अधिक के लिए Python special method names देखें।

शायद सबसे भ्रामक/इस बात का भ्रामक हिस्सा (खासकर यदि आप जावा जैसे अन्य OO भाषाओं के लिए इस्तेमाल कर रहे हैं) Person.name और person.name (जहां personPerson का एक उदाहरण है) के लिए किसी भी संबंध नहीं है की जरूरत नहीं है कि है एक दूसरे। उदाहरण के लिए:

class Person(object): 
    name = "name of class" 
    def __init__(self): 
    self.name = "name of instance" 

person = Person() 
print Person.name 
print person.name 

यह प्रिंट होगा:

name of class 
name of instance 

ध्यान दें कि वर्ग संपत्ति सिर्फ जबकि उदाहरण संपत्ति __init__ विधि में सेट है, वर्ग शरीर में सेट है।

class LambdaThingy(object): 
    def __init__(self, attrname): 
    self.__attrname = attrname 

    def __eq__(self, other): 
    return lambda x: getattr(x, self.__attrname) == other 

class Person(object): 
    name = LambdaThingy('name') 

    def __init__(self, name): 
    self.name = name 

equals_fred = Person.name == "Fred" 
equals_barney = Person.name == "Barney" 

fred = Person("Fred") 

print equals_fred(fred) 
print equals_barney(fred) 

यह प्रिंट:

True 
False 

यह निश्चित रूप है

आपके मामले में, आप कस्टम __eq__ विधि है कि एक लैम्ब्डा देता है, कुछ इस तरह के साथ वस्तु को Person.name सेट करेंगे "बहुत चालाक" होने के किनारे पर स्कर्टिंग, इसलिए मैं उत्पादन कोड में इसका उपयोग करने के बारे में बहुत सावधान रहूंगा। भविष्य में रखरखाव करने वालों के लिए शायद एक स्पष्ट लैम्ब्डा बहुत स्पष्ट होगा, भले ही यह थोड़ा और वर्बोज़ हो।

+0

+1! – lothar

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