software - python tutorial pdf




पायथन में पास स्टेटमेंट का उपयोग कैसे करें (9)

अनुपूरक कार्यों के लिए प्लेसहोल्डर के रूप में इसके उपयोग के अलावा, pass एक और कथन भरने में उपयोगी हो सकता है ("स्पष्ट निहित से बेहतर है।")

def some_silly_transform(n):
    # Even numbers should be divided by 2
    if n % 2 == 0:
        n /= 2
        flag = True
    # Negative odd numbers should return their absolute value
    elif n < 0:
        n = -n
        flag = True
    # Otherwise, number should remain unchanged
    else:
        pass

बेशक, इस मामले में, शायद असाइनमेंट की बजाय return उपयोग करेगा, लेकिन जिन मामलों में उत्परिवर्तन वांछित है, यह सबसे अच्छा काम करता है।

यहां pass का उपयोग विशेष रूप से भविष्य के रखरखाव करने वालों को चेतावनी देने के लिए उपयोगी है (स्वयं सहित!) सशर्त बयान के बाहर अनावश्यक कदम नहीं डालना। उपर्युक्त उदाहरण में, flag दो विशेष रूप से उल्लिखित मामलों में सेट किया गया है, लेकिन else चीज़ों में नहीं। pass का उपयोग किए बिना, एक भविष्य प्रोग्रामर flag = True स्थिति के बाहर flag = True हो सकता है-इस प्रकार सभी मामलों में flag सेट कर सकता है।

एक और मामला बॉयलरप्लेट फ़ंक्शन के साथ अक्सर फ़ाइल के नीचे देखा जाता है:

if __name__ == "__main__":
    pass

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

आखिरकार, जैसा कि अन्य उत्तरों में उल्लिखित है, अपवाद पकड़े जाने पर कुछ भी करने के लिए उपयोगी हो सकता है:

try:
    n[i] = 0
except IndexError:
    pass

मैं पाइथन सीखने की प्रक्रिया में हूं और मैं pass स्टेटमेंट के बारे में अनुभाग तक पहुंच गया हूं। जिस मार्गदर्शिका का मैं उपयोग कर रहा हूं वह इसे एक Null स्टेटमेंट के रूप में परिभाषित करता है जिसे आमतौर पर प्लेसहोल्डर के रूप में उपयोग किया जाता है।

मैं अभी भी पूरी तरह से समझ में नहीं आता कि इसका मतलब क्या है। क्या कोई मुझे एक साधारण / मूल स्थिति दिखा सकता है जहां pass स्टेटमेंट का उपयोग किया जाएगा और इसकी आवश्यकता क्यों है?


आप कह सकते हैं कि पास का अर्थ एनओपी (कोई ऑपरेशन) ऑपरेशन है। इस उदाहरण के बाद आपको एक स्पष्ट तस्वीर मिल जाएगी: -

सी कार्यक्रम

#include<stdio.h>

void main()
{
    int age = 12;

    if( age < 18 )
    {
         printf("You are not adult, so you can't do that task ");
    }
    else if( age >= 18 && age < 60)
    {
        // I will add more code later inside it 
    }
    else
    {
         printf("You are too old to do anything , sorry ");
    }
}

अब आप पाइथन में कैसे लिखेंगे: -

age = 12

if age < 18:

    print "You are not adult, so you can't do that task"

elif age >= 18 and age < 60:

else:

    print "You are too old to do anything , sorry "

लेकिन आपका कोड त्रुटि देगा क्योंकि इसे एलिफ के बाद इंडेंट ब्लॉक की आवश्यकता है। पास कीवर्ड की भूमिका यहां दी गई है।

age = 12

if age < 18:

    print "You are not adult, so you can't do that task"

elif age >= 18 and age < 60:

    pass

else:

    print "You are too old to do anything , sorry "

अब मुझे लगता है कि यह आपको स्पष्ट है।


एक सामान्य उपयोग केस जहां इसे 'जैसा है' का उपयोग किया जा सकता है, केवल एक प्रकार बनाने के लिए कक्षा को ओवरराइड करना है (जो अन्यथा सुपरक्लास के समान है), उदाहरण के लिए

class Error(Exception):
    pass

तो आप Error अपवाद उठा सकते हैं और पकड़ सकते हैं। सामग्री के बजाए अपवाद का प्रकार यहां क्या मायने रखता है।


जैसा कि पुस्तक ने कहा था, मैं केवल इसे एक अस्थायी प्लेसहोल्डर के रूप में उपयोग करता हूं, यानि,

# code that does something to to a variable, var
if var == 2000:
    pass
else:
    var += 1

और फिर बाद में परिदृश्य भरें जहां var == 2000


पाइथन में पास स्टेटमेंट का उपयोग तब किया जाता है जब एक कथन को वाक्य रचनात्मक रूप से आवश्यक होता है लेकिन आप कोई कमांड या कोड निष्पादित नहीं करना चाहते हैं।

पास स्टेटमेंट एक शून्य ऑपरेशन है; निष्पादित होने पर कुछ भी नहीं होता है। पास उन जगहों पर भी उपयोगी है जहां आपका कोड अंततः जाएगा, लेकिन अभी तक लिखा नहीं गया है (उदाहरण के लिए, उदाहरण के लिए स्टब्स में):

`उदाहरण:

#!/usr/bin/python

for letter in 'Python': 
   if letter == 'h':
      pass
      print 'This is pass block'
   print 'Current Letter :', letter

print "Good bye!"

यह निम्नलिखित परिणाम देगा:

Current Letter : P
Current Letter : y
Current Letter : t
This is pass block
Current Letter : h
Current Letter : o
Current Letter : n
Good bye!

यदि पिछले अक्षर 'एच' है तो पिछले कोड किसी कथन या कोड को निष्पादित नहीं करता है। पास कथन उपयोगी होता है जब आपने कोड ब्लॉक बनाया है लेकिन अब इसकी आवश्यकता नहीं है।

फिर आप ब्लॉक के अंदर बयान हटा सकते हैं लेकिन ब्लॉक को पास स्टेटमेंट के साथ रहने दें ताकि यह कोड के अन्य हिस्सों में हस्तक्षेप न करे।


पायथन में सिंटैक्टिकल आवश्यकता है जो कोड ब्लॉक ( if , except , def , class इत्यादि) खाली नहीं हो सकता है। खाली कोड ब्लॉक विभिन्न संदर्भों में उपयोगी होते हैं, जैसे कि नीचे दिए गए उदाहरणों में, जो मैंने देखा है सबसे अधिक उपयोग किए जाने वाले मामले हैं।

इसलिए, यदि कोड ब्लॉक में कुछ भी नहीं होने वाला है, तो इस तरह के ब्लॉक के लिए IndentationError उत्पन्न करने के लिए pass की आवश्यकता होती है। वैकल्पिक रूप से, किसी भी कथन (मूल्यांकन के लिए केवल एक शब्द सहित, Ellipsis शाब्दिक ... या एक स्ट्रिंग, अक्सर एक डॉकस्ट्रिंग) का उपयोग किया जा सकता है, लेकिन pass स्पष्ट करता है कि वास्तव में कुछ भी होने वाला नहीं है, और इसकी आवश्यकता नहीं है वास्तव में मूल्यांकन किया जाना चाहिए और (कम से कम अस्थायी रूप से) स्मृति में संग्रहीत किया जाना है।

  • अनदेखा (सभी या) एक निश्चित प्रकार का Exception ( xml से उदाहरण):

    try:
        self.version = "Expat %d.%d.%d" % expat.version_info
    except AttributeError:
        pass # unknown
    

    नोट: सभी प्रकार के उछाल को अनदेखा करते हुए, जैसा कि pandas से निम्नलिखित उदाहरण में किया जाता है, आमतौर पर खराब अभ्यास माना जाता है, क्योंकि यह उन अपवादों को भी पकड़ता है जिन्हें संभवतः कॉलर पर पास किया जाना चाहिए, जैसे SystemExit या SystemExit (या यहां तक ​​कि HardwareIsOnFireError SystemExit - आप कैसे जानते हैं आप विशिष्ट त्रुटियों के साथ कस्टम बॉक्स पर नहीं चल रहे हैं, जो कुछ कॉलिंग एप्लिकेशन जानना चाहते हैं?)।

    try:
        os.unlink(filename_larry)
    except:
        pass
    

    इसके बजाय except Error: कम से कम उपयोग करना except Error: या इस मामले में अधिमानतः except OSError: बहुत बेहतर अभ्यास माना जाता है। मैंने स्थापित सभी पायथन मॉड्यूल का एक त्वरित विश्लेषण मुझे दिया है कि सभी except ...: pass 10% से अधिक except ...: pass स्टेटमेंट्स सभी अपवादों को पकड़ते हैं, इसलिए यह अभी भी पायथन प्रोग्रामिंग में लगातार पैटर्न है।

  • एक अपवाद वर्ग प्राप्त करना जो नए व्यवहार को जोड़ता नहीं है (उदाहरण के लिए scipy ):

    class CompileError(Exception):
        pass
    

    इसी तरह, अमूर्त बेस क्लास के रूप में लक्षित वर्गों में अक्सर एक खाली खाली __init__ या अन्य विधियां होती हैं जो उप-वर्गों को प्राप्त करने के लिए होती हैं। (उदाहरण के लिए pebl )

    class _BaseSubmittingController(_BaseController):
        def submit(self, tasks): pass
        def retrieve(self, deferred_results): pass
    
  • परीक्षणों को जांचने के बिना, कुछ परीक्षण मानों के लिए कोड ठीक से चलता है ( mpmath ):

    for x, error in MDNewton(mp, f, (1,-2), verbose=0,
                             norm=lambda x: norm(x, inf)):
        pass
    
  • वर्ग या फ़ंक्शन परिभाषाओं में, प्रायः ब्लॉक में एकमात्र चीज़ के रूप में निष्पादित करने के लिए अनिवार्य कथन के रूप में एक डॉकस्ट्रिंग पहले से ही मौजूद है। ऐसे मामलों में, ब्लॉक में pebl अलावा pass हो सकता है ताकि यह कह सके कि "यह वास्तव में कुछ भी करने का इरादा नहीं है।" उदाहरण के लिए pebl :

    class ParsingError(Exception): 
        """Error encountered while parsing an ill-formed datafile."""
        pass
    
  • कुछ मामलों में, pass प्लेसहोल्डर के रूप में उपयोग करने के लिए कहा जाता है कि "यह विधि / कक्षा / यदि-ब्लॉक / ... अभी तक लागू नहीं किया गया है, लेकिन यह करने का स्थान होगा", हालांकि मैं व्यक्तिगत रूप से Ellipsis शाब्दिक पसंद करता हूं ... पिछले उदाहरण में इस और जानबूझकर "नो-ऑप" के बीच सख्ती से अंतर करने के लिए। उदाहरण के लिए, यदि मैं व्यापक स्ट्रोक में एक मॉडल लिखता हूं, तो मैं लिख सकता हूं

    def update_agent(agent):
        ... 
    

    जहां अन्य हो सकता है

    def update_agent(agent):
        pass
    

    से पहले

    def time_step(agents):
        for agent in agents:
            update_agent(agent)
    

    बाद के बिंदु पर update_agent फ़ंक्शन को भरने के लिए अनुस्मारक के रूप में, लेकिन कुछ परीक्षण पहले से ही यह देखने के लिए चलाएं कि शेष कोड इरादे से व्यवहार करता है या नहीं। (इस मामले के लिए एक तीसरा विकल्प raise NotImplementedError को raise NotImplementedError । यह विशेष रूप से दो मामलों के लिए उपयोगी है: या तो "यह सार विधि प्रत्येक सबक्लास द्वारा कार्यान्वित की जानी चाहिए, इस बेस क्लास में इसे परिभाषित करने का कोई सामान्य तरीका नहीं है" , या "यह फ़ंक्शन , इस नाम के साथ, अभी तक इस रिलीज में लागू नहीं किया गया है, लेकिन यही वह हस्ताक्षर जैसा दिखता है " )


मान लीजिए कि आप कुछ विधियों के साथ एक नई कक्षा तैयार कर रहे हैं जिसे आप कार्यान्वित नहीं करना चाहते हैं, फिर भी।

class MyClass(object):
    def meth_a(self):
        pass

    def meth_b(self):
        print "I'm meth_b"

यदि आप pass छोड़ देंगे, तो कोड नहीं चलेगा।

फिर आप एक प्राप्त करेंगे

IndentationError: expected an indented block

संक्षेप में, pass स्टेटमेंट कुछ खास नहीं करता है लेकिन प्लेसहोल्डर के रूप में कार्य कर सकता है, जैसा कि पहले दिखाया गया है।


यदि आप नहीं जानते कि आप एक निश्चित कोड ब्लॉक में क्या डाल रहे हैं

try:
   int(someuserinput)
except ValueError:
   pass

परीक्षणों को दबाते समय भी इसका इस्तेमाल करना पसंद है। मैं अक्सर जानता हूं कि मैं परीक्षण करने के लिए क्या झूठ बोलूंगा लेकिन मुझे नहीं पता कि यह कैसे करना है। परीक्षण उदाहरण उदाहरण के रूप में sebastian_oe सुझाव दिया

class TestFunctions(unittest.TestCase):

   def test_some_feature(self):
      pass

   def test_some_other_feature(self):
      pass

pass बारे में सोचने का सबसे अच्छा और सबसे सटीक तरीका दुभाषिया को कुछ भी करने के लिए स्पष्ट रूप से बताने का तरीका नहीं है। उसी तरह से निम्नलिखित कोड:

def foo(x,y):
    return x+y

का अर्थ है "अगर मैं फ़ंक्शन foo (x, y) को कॉल करता हूं, तो दो संख्याओं को लेबल एक्स और वाई का प्रतिनिधित्व करते हैं और परिणाम को वापस सौंपते हैं"

def bar():
    pass

का अर्थ है "अगर मैं फ़ंक्शन बार () को कॉल करता हूं, तो बिल्कुल कुछ भी नहीं करें।"

अन्य उत्तरों काफी सही हैं, लेकिन यह उन कुछ चीजों के लिए भी उपयोगी है जिनमें स्थान-धारण शामिल नहीं है।

उदाहरण के लिए, मैंने हाल ही में कुछ कोडों में काम किया है, दो चर को विभाजित करना आवश्यक था, और divisor शून्य होने के लिए यह संभव था।

c = a / b

जाहिर है, शून्य शून्य होने पर ज़ीरोडिविजन त्रुटि उत्पन्न करेगा। इस विशेष स्थिति में, सी को शून्य के रूप में छोड़ना इस मामले में वांछित व्यवहार था कि बी शून्य था, इसलिए मैंने निम्न कोड का उपयोग किया:

try:
    c = a / b
except ZeroDivisionError:
    pass

एक और, कम मानक उपयोग आपके डीबगर के लिए ब्रेकपॉइंट डालने के लिए एक आसान जगह के रूप में है। उदाहरण के लिए, मैं कथन में 20 वीं पुनरावृत्ति पर डीबगर में तोड़ने के लिए कुछ कोड चाहता था। इसलिए:

for t in range(25):
    do_a_thing(t)
    if t == 20:
        pass

पास पर ब्रेकपॉइंट के साथ।





python