दिलचस्प पोस्ट
एक ज़ूम करने योग्य ViewGroup को बनाने के लिए RelativeLayout को विस्तारित करना, और ओवरराइडिंग डिस्पैच () टेक्सरेआ में लाइनों की सीमा और jQuery का उपयोग करने वाली डिस्प्ले लाइन गिनती स्कैनर बनाम बफ़्रैटेड रीडर एकत्रीकरण बनाम रचना गैर-अनुमानित संदर्भ के लिए वैकल्पिक हल रूबी में अपवाद => ई 'को बचाने के लिए यह खराब शैली क्यों है? + = नया इवेंटहाँडलर (विधि) बनाम + = विधि Google नक्शे को मार्क्स के साथ लाइट / एलएजी से एजेक्स की सफलता से डेटा वापस लाया गया क्या क्लाइंट साइड पर हैशिंग पासवर्ड लायक है? मैं अपनी बैच फ़ाइल को कैसे स्वत: बढ़ा सकता हूं, ताकि यह आवश्यक हो कि यूएए प्रशासक अधिकारों से अनुरोध करे? जावास्क्रिप्ट / jQuery के साथ मैं फॉर्म डेटा कैसे प्राप्त करूं? क्या Android पर एप्लिकेशन को स्वचालित रूप से अपडेट करने का कोई तरीका है? कैसे जावा में एक जावा स्ट्रिंग literally unescape? ईटग बनाम हैडर का समापन File.Create () का उपयोग करने के बाद फ़ाइल को दूसरी प्रक्रिया द्वारा उपयोग किया जा रहा है

अजगर "के साथ" क्या डिज़ाइन किया गया है?

मैं आज पहली बार बयान के with अजगर के पार आया मैं कई महीनों तक हल्के ढंग से अजगर का उपयोग कर रहा हूं और इसके अस्तित्व का पता भी नहीं चला! इसकी कुछ अस्पष्ट स्थिति को देखते हुए मैंने सोचा कि यह पूछने योग्य होगा:

  1. के लिए इस्तेमाल किया जा डिजाइन डिज़ाइन के with पायथन क्या है?
  2. आप इसका उपयोग किस लिए करते हैं?
  3. क्या मेरे पास किसी भी प्रकार के बारे में पता होना चाहिए, या इसकी उपयोग के साथ जुड़े आम विरोधी पैटर्न हैं? किसी भी मामले में जहां बेहतर इस्तेमाल होता है try..finally तुलना में try..finally with ?
  4. यह अधिक व्यापक रूप से इस्तेमाल क्यों नहीं किया जाता है?
  5. कौन सा मानक पुस्तकालय कक्षाएं इसके साथ संगत हैं?

वेब के समाधान से एकत्रित समाधान "अजगर "के साथ" क्या डिज़ाइन किया गया है?"

  1. मेरा मानना ​​है कि यह पहले ही मेरे पहले के अन्य उपयोगकर्ताओं द्वारा उत्तर दिया गया है, इसलिए मैं केवल इसे पूर्णता के लिए जोड़ता हूं: बयान के with तथाकथित संदर्भ प्रबंधकों में सामान्य तैयारी और सफाई कार्यों के ढांचे के द्वारा अपवाद प्रबंधन को सरल करता है। अधिक जानकारी पीईपी 343 में पाई जा सकती है। उदाहरण के लिए, open स्टेटमेंट एक कॉन्टैक्ट मैनेजर है, जो आपको एक फाइल खोलने देता है, इसे तब तक खुला रखे जब तक निष्पादन उस वक्तव्य के संदर्भ में हो जहां आपने इसे इस्तेमाल किया हो, और जैसे ही आप इसे छोड़ दें संदर्भ, कोई फर्क नहीं पड़ता कि आपने अपवाद के कारण या नियमित नियंत्रण प्रवाह के दौरान इसे छोड़ा है या नहीं। इसके with सीमेंट को आरएआई पैटर्न के समान सी ++ में इस्तेमाल किया जा सकता है: कुछ स्रोत को बयान के with अधिग्रहण किया with है और जब आप संदर्भ के with छोड़ते हैं तब जारी होते हैं।

  2. कुछ उदाहरण हैं: with open(filename) as fp: फ़ाइलें with open(filename) as fp: , with open(filename) as fp: लॉक के उपयोग with lock: ताले प्राप्त करना with lock: (जहां lock threading.Lock का एक उदाहरण है। lock ) आप contextlib से contextlib डेकोरेटर का उपयोग करके अपने स्वयं के संदर्भ प्रबंधकों का निर्माण भी कर सकते हैं। उदाहरण के लिए, मैं अक्सर इसका उपयोग तब करता हूं जब मुझे अस्थायी रूप से वर्तमान निर्देशिका को बदलना पड़ता है और फिर मैं कहां लौटता हूं:

     from contextlib import contextmanager import os @contextmanager def working_directory(path): current_dir = os.getcwd() os.chdir(path) try: yield finally: os.chdir(current_dir) with working_directory("data/stuff"): # do something within data/stuff # here I am back again in the original working directory 

    यहां एक और उदाहरण है जो अस्थायी रूप से sys.stdin , sys.stdout और sys.stderr को किसी अन्य फ़ाइल संभाल के लिए रीडायरेक्ट करता है और बाद में उन्हें पुनर्स्थापित करता है:

     from contextlib import contextmanager import sys @contextmanager def redirected(**kwds): stream_names = ["stdin", "stdout", "stderr"] old_streams = {} try: for sname in stream_names: stream = kwds.get(sname, None) if stream is not None and stream != getattr(sys, sname): old_streams[sname] = getattr(sys, sname) setattr(sys, sname, stream) yield finally: for sname, stream in old_streams.iteritems(): setattr(sys, sname, stream) with redirected(stdout=open("/tmp/log.txt", "w")): # these print statements will go to /tmp/log.txt print "Test entry 1" print "Test entry 2" # back to the normal stdout print "Back to normal stdout again" 

    और अंत में, एक और उदाहरण जो एक अस्थायी फ़ोल्डर बनाता है और संदर्भ को छोड़ते समय उसे साफ करता है:

     from tempfile import mkdtemp from shutil import rmtree @contextmanager def temporary_dir(*args, **kwds): name = mkdtemp(*args, **kwds) try: yield name finally: shutil.rmtree(name) with temporary_dir() as dirname: # do whatever you want 

मैं दो दिलचस्प व्याख्यान का सुझाव दूंगा:

  • PEP 343 "के साथ" वक्तव्य
  • एफ़फोबॉट पाइथन के "साथ" स्टेटमेंट को समझना

1. बयान के साथ एक संदर्भ प्रबंधक द्वारा परिभाषित विधियों के साथ एक ब्लॉक के निष्पादन को लपेटने के लिए उपयोग किया जाता है। यह सामान्य try...except...finally उपयोग के पैटर्न को सुविधाजनक पुन: उपयोग के लिए समझाया जा सकता है

2. आप ऐसा कुछ कर सकते हैं:

 with open("foo.txt") as foo_file: data = foo_file.read() 

या

 from contextlib import nested with nested(A(), B(), C()) as (X, Y, Z): do_something() 

या (पायथन 3.1)

 with open('data') as input_file, open('result', 'w') as output_file: for line in input_file: output_file.write(parse(line)) 

या

 lock = threading.Lock() with lock: # Critical section of code 

3. मुझे यहां कोई एंटीपाटन देखने नहीं है।
पायथन में डुबकी लगाने का उद्धरण:

कोशिश करो..असल में अच्छा है। साथ बेहतर है

4. मुझे लगता है कि यह प्रोग्रामर की आदत से संबंधित try..catch..finally का प्रयोग try..catch..finally भाषाओं से try..catch..finally बयान।

कथन के with पायथन Resource Acquisition Is Initialization का निर्मित भाषा समर्थन है Resource Acquisition Is Initialization मुहावरे सामान्यतः सी ++ में उपयोग किया जाता है यह इरादा है कि ऑपरेटिंग सिस्टम संसाधनों के सुरक्षित अधिग्रहण और रिहाई की अनुमति होगी।

बयान के with एक स्कोप / ब्लॉक के भीतर संसाधन बनाता है आप ब्लॉक के भीतर संसाधनों का उपयोग करके अपना कोड लिखें। जब ब्लॉक से बाहर निकलता है तो ब्लॉक में कोड के परिणाम की परवाह किए बिना संसाधनों को साफ तौर पर जारी किया जाता है (यह है कि क्या ब्लॉक आम तौर पर मौजूद है या अपवाद के कारण)।

पायथन लाइब्रेरी में कई संसाधन जो कि कथन के with आवश्यक प्रोटोकॉल का पालन करते हैं और इससे इसके उपयोग से-आउट-बॉक्स हो सकते हैं हालांकि कोई भी संसाधनों का उपयोग कर सकता है जो कि अच्छी तरह से प्रलेखित प्रोटोकॉल को कार्यान्वित करके बयान में उपयोग किया जा सकता है: पीईपी 0343

इसका प्रयोग करें जब कभी आप अपने आवेदन में संसाधन प्राप्त करते हैं, जिसे स्पष्ट रूप से फ़ाइलें, नेटवर्क कनेक्शन, लॉक और पसंद जैसे छोड़ना चाहिए।

एक विरोधी का एक उदाहरण लूप के अंदर का उपयोग करने के लिए हो सकता है जब यह लूप with बाहर अधिक कुशल होता है

उदाहरण के लिए

 for row in lines: with open("outfile","a") as f: f.write(row) 

बनाम

 with open("outfile","a") as f: for row in lines: f.write(row) 

पहला तरीका प्रत्येक row लिए फ़ाइल को खोलना और बंद करना है जो दूसरी तरफ की तुलना में कार्यक्षमता की समस्या पैदा कर सकता है और फाइल को केवल एक बार बंद कर देता है

पूर्णता के लिए फिर से मैं बयानों के with अपना सबसे उपयोगी उपयोग-केस जोड़ूंगा।

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

मैं अपनी डिफ़ॉल्ट सटीकता को कम संख्या में सेट कर रहा हूं और कुछ वर्गों के लिए अधिक सटीक उत्तर पाने के लिए इसके with उपयोग करता हूं:

 from decimal import localcontext with localcontext() as ctx: ctx.prec = 42 # Perform a high precision calculation s = calculate_something() s = +s # Round the final result back to the default precision 

मैं इसे हाइपरजेमेट्रिक टेस्ट के साथ बहुत उपयोग करता हूं जिसके लिए बड़े संख्याओं के विभाजन की आवश्यकता होती है, जिसके फलस्वरूप फार्मैलिकल्स होते हैं। जब आप जीनोमिक स्केल गणना करते हैं तो आपको राउंड-ऑफ और अतिप्रवाह त्रुटियों का ध्यान रखना होगा।

पीईपी 343 देखें – 'के साथ' कथन , अंत में एक उदाहरण अनुभाग है।

… पायथन भाषा में "से" नया बयान करने के लिए इसे संभवतः प्रयास / अंत में बयान के मानक उपयोगों को कारक बनाने के लिए संभव है।

बयान के साथ तथाकथित संदर्भ प्रबंधकों के साथ काम करता है:

http://docs.python.org/release/2.5.2/lib/typecontextmanager.html

यह विचार 'साथ' ब्लॉक छोड़ने के बाद जरूरी सफाई करके अपवाद प्रबंधन को सरल करना है कुछ अजगर बिल्ट-इन पहले से ही संदर्भ प्रबंधकों के रूप में काम करते हैं।

अंक 1, 2, और 3 काफी अच्छी तरह से कवर किया जा रहा है:

4: यह अपेक्षाकृत नया है, केवल python2.6 + (या python2.5 में उपलब्ध है from __future__ import with_statement का उपयोग करके)

आउट-ऑफ-द-बॉक्स समर्थन के लिए एक और उदाहरण, और एक जो कि पहले से थोड़ी चकरा देने वाला हो सकता है जब आप open() व्यवहार के लिए उपयोग किए जाते हैं, तो लोकप्रिय डेटाबेस मॉड्यूल के connection ऑब्जेक्ट जैसे:

  • sqlite3
  • psycopg2
  • cx_Oracle

connection ऑब्जेक्ट्स संदर्भ मैनेजरों हैं और जैसे-इन-बक्से में आउट-ऑफ-द-बॉक्स का उपयोग किया जा सकता है, हालांकि उपरोक्त नोट का उपयोग करते समय:

जब with-block समाप्त होता है, या तो अपवाद या बिना, कनेक्शन बंद नहीं होता है । यदि with-block साथ एक अपवाद के साथ समाप्त हो जाता है, तो लेन-देन वापस लाया जाता है, अन्यथा लेन-देन का श्रेय दिया जाता है।

इसका मतलब यह है कि प्रोग्रामर को स्वयं कनेक्शन को बंद करने के लिए सावधानी बरतनी होगी, लेकिन एक कनेक्शन प्राप्त करने की अनुमति है, और इसे कई with-statements में प्रयोग करें, जैसा कि psycopg2 डॉक्स में दिखाया गया है:

 conn = psycopg2.connect(DSN) with conn: with conn.cursor() as curs: curs.execute(SQL1) with conn: with conn.cursor() as curs: curs.execute(SQL2) conn.close() 

उपरोक्त उदाहरण में, आप ध्यान दें कि psycopg2 के cursor ऑब्जेक्ट भी संदर्भ मैनेजर हैं। व्यवहार पर संबंधित दस्तावेज़ से:

जब कोई cursor अवर with-block बाहर निकलता है, तो इसे बंद कर दिया जाता है, जो इसके साथ जुड़े किसी संसाधन को जारी करता है। लेनदेन की स्थिति प्रभावित नहीं होती है।