2012-04-05 12 views
19

मैं पाइथन जेनरेटर से परिचित हूं, हालांकि मैं अभी "जेनरेटिव विधि" शब्द भर चुका हूं जिसे मैं परिचित नहीं हूं और संतोषजनक परिभाषा नहीं पा रहा हूं।एक जनरेटिव विधि क्या है?

संदर्भ में कहें, मैं SQLAlchemy की कथा दस्तावेज में अवधि पाया:

() विधि कनेक्शन, इंजन पर उपलब्ध कराई गई "autocommit" व्यवहार पर पूरा नियंत्रण बना उत्पादक Connection.execution_options का उपयोग कर उपलब्ध है, निष्पादन योग्य, "autocommit" ध्वज का उपयोग करके जो चयनित दायरे के लिए स्वत: टिप्पणी चालू या बंद कर देगा।

जनरेटिव विधि क्या है? Connection.execution_options() द्वारा लौटाई गई वस्तु को पुन: सक्रिय करने का प्रयास नहीं करता है, इसलिए मुझे लगता है कि यह मानक जनरेटर के अलावा कुछ और है।

+0

कुछ Googling चलता है कि यह कोड पीढ़ी के बारे में बात की जा सकती है, लेकिन यह संभावना नहीं लगता है ... http://www.program-transformation.org/Transform/GenerativeProgrammingWiki – jimw

+0

यह एक अजगर जनरेटर मतलब यह नहीं है, यह सुनिश्चित करने के लिए है । यह विधि कनेक्शन स्थिति को संशोधित करने के लिए है, इसलिए अनुक्रम उत्पन्न करने के लिए इसका कोई अर्थ नहीं है। – alexis

उत्तर

30

यह एक आम डेटाबेस अवधारणा होने के लिए प्रकट नहीं होता है, लेकिन SQLAlchemy भावना "रनटाइम पर iteratively अपने कार्यक्रम द्वारा उत्पन्न" में अवधि उत्पादक उपयोग करता है। (इसलिए, अजगर जनरेटर के लिए कोई कनेक्शन नहीं)। the tutorial:

Query वस्तु से एक उदाहरण पूरी तरह से उत्पादक, अर्थ सबसे विधि एक नया Query वस्तु जिस पर आगे मापदंड जोड़ा जा सकता है लौटने कॉल है। उदाहरण के लिए, की "एड जोन्स" एक पूरे नाम के साथ "एड" नाम उपयोगकर्ताओं के लिए क्वेरी करने के लिए, आप filter() दो बार फोन कर सकते हैं, जो का उपयोग कर मापदंड जुड़ जाता है और:

>>> for user in session.query(User).\ 
... filter(User.name=='ed').\ 
... filter(User.fullname=='Ed Jones'): 
...  print user 

इस कॉल वाक्य रचना और अधिक सामान्यतः है "विधि श्रृंखला" के रूप में जाना जाता है, और यह डिज़ाइन जो इसे "fluent interface" के रूप में अनुमति देता है।

तो, Connection.execution_options() के मामले में, "जनरेटिव" का अर्थ है कि यह संशोधित कनेक्शन ऑब्जेक्ट देता है, ताकि आप उपर्युक्त कॉल को चेन कर सकें।

+1

यह एसक्यूएल कथन टुकड़े टुकड़े "उत्पन्न करता है"। – Keith

+0

हां, और अन्य वस्तुओं के सभी प्रकार। एसक्यूएल कथन वास्तव में 'क्वेरी' encapsulates क्या हैं। – alexis

+1

अच्छी कॉल मैं उस शब्द को डॉक्स – zzzeek

3

आपको वास्तव में सुनिश्चित करने के लिए उस प्रोजेक्ट के विशिष्ट दस्तावेज या स्रोत कोड से परामर्श करना होगा, लेकिन मुझे लगता है कि यह तर्कों द्वारा परिभाषित आवश्यकताओं/व्यवहार के अनुकूल कुछ ऑब्जेक्ट का एक संशोधित संस्करण देता है।

documentation कहता है:

विधि इस Connection जो एक ही अंतर्निहित DBAPI कनेक्शन का संदर्भ की एक प्रति देता है, लेकिन यह भी दिया निष्पादन विकल्प जो execute() के लिए एक कॉल के लिए प्रभावी होगा परिभाषित करता है।

4

Connection.execution_options (lib/sqlalchemy/engine/base.py) के स्रोत कोड को देखते हुए, वह सभी विधि कनेक्शन में विकल्प जोड़ती है।

विचार यह है कि वे विकल्प भविष्य के व्यवहार को प्रभावित करते हैं। प्रश्नों।

एक उदाहरण के रूप:

 result = connection.execution_options(stream_results=True).\ 
          execute(stmt) 

यहाँ, व्यवहार सिर्फ इस प्रश्न के लिए कनेक्शन के बीच में बदल गया था। एक तरह से, यह एक वस्तु के रूप में "उत्पन्न करता है" या क्लोन स्वयं को थोड़ा अलग व्यवहार करता है।

यहां आप ऑटोकॉमिट को भी सही पर सेट कर सकते हैं। उदाहरण

# obtain a connection 
connection = ... 
# do some stuff 
# for the next section we want autocommit on 
autocommitting_connection = connection.execution_options(autocommit=True) 
autocommitting_connection.execute(some_insert) 
result = autocommitting_connection.execute(some_query) 
# done with this section. Continue using connection (no autocommit) 

यह दस्तावेज के उस खंड के साथ है। "जनरेटिव विधि" एक विधि को संदर्भित करती है जो उसी उदाहरण की एक संशोधित प्रति लौटाती है जिसके साथ आप काम करना जारी रख सकते हैं। यह वर्ग कनेक्शन, इंजन, निष्पादन योग्य वर्गों पर लागू होता है।

+0

यह सुनिश्चित न करें कि परिवर्तन "केवल इस क्वेरी के लिए" है। कुछ विकल्प अंतर्निहित कनेक्शन ऑब्जेक्ट को प्रभावित करते हैं, और इसलिए वे बने रहते हैं। उदाहरण के लिए – alexis

+0

@alexis मैं ("यहां") देता हूं, यह सिर्फ इस क्वेरी के लिए है। कनेक्शन को जनरेटिव विधि द्वारा कभी संशोधित नहीं किया जाता है, लेकिन एक संशोधित प्रति वापस लौटा दी जाती है। जब तक आप एक ऐसा उदाहरण नहीं देते हैं जहां अंतर्निहित कनेक्शन ऑब्जेक्ट वास्तव में प्रभावित होता है। – j13r

+0

http://docs.sqlalchemy.org/en/latest/core/connections.html#sqlalchemy.engine.base.Connection.execution_options के अनुसार, 'isolation_level' में परिवर्तन अंतर्निहित कनेक्शन बंद होने तक जारी रहता है। – alexis

0

ऊपर @zzzeek टिप्पणियों के रूप में, अब यह SQLAlchemy glossary में प्रलेखित है।

generative का अर्थ है:

एक शब्द है कि SQLAlchemy उल्लेख करने के लिए जो सामान्य रूप से विधि श्रृंखलन के रूप में जाना जाता है का उपयोग करता है; विवरण के लिए वह शब्द देखें।

और method chaining है:

एक ऑब्जेक्ट-ओरिएंटेड तकनीक जिससे एक वस्तु का राज्य वस्तु पर तरीकों को फोन करके बनाया जाता है। ऑब्जेक्ट में किसी भी प्रकार की विधियों की सुविधा होती है, जिनमें से प्रत्येक ऑब्जेक्ट में जोड़े गए अतिरिक्त राज्य के साथ एक नई ऑब्जेक्ट (या कुछ मामलों में एक ही ऑब्जेक्ट) देता है।

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