क्यों खाली समारोह की जरूरत है


9

मैं अजगर सीखने शुरू कर दिया और मैं सोच रहा हूँ क्यों खाली समारोह की जरूरत है एक प्रोग्रामिंग भाषा में

अजगर में जैसे:

def empty_func():
    pass

यहां तक ​​कि शेल स्क्रिप्ट में खाली फ़ंक्शन खाली फ़ंक्शन उपलब्ध हैं।

मेरी समझ और प्रश्न:

  1. प्रोग्रामिंग भाषा को खाली कार्यों की आवश्यकता क्यों है? क्या यह सिर्फ प्रोग्रामिंग भाषा के साथ खेलने के लिए है या कुछ और नहीं जो वास्तव में मायने रखता है?

  2. यदि इसका कोई उद्देश्य है, तो क्या कोई उपयोग के मामले का वर्णन कर सकता है या खाली कार्यों के उपयोग का वास्तविक उदाहरण दे सकता है?

  3. या क्या प्रोग्रामिंग भाषाओं की कोई परंपरा खाली कार्यों की अनुमति देती है?


EDIT (आपके उत्तर पढ़ने से मुझे मिली चीजें):

  • स्केचिंग एल्गोरिदम के लिए या सार कार्यों के साथ
  • कोई कार्रवाई नहीं करने के साथ प्रपत्र सबमिट करने के लिए
  • कुछ के लिए प्लेसहोल्डर अनिवार्य संचालन

1
यदि प्रोग्राम निष्पादन उन्हें खोजने / उपयोग करने की अपेक्षा करता है, तो उन्हें STUBS के रूप में उपयोग किया जा सकता है, हालाँकि आप उनके माध्यम से कुछ भी बदलना नहीं चाहते हैं।
जी। रैसोव्स्की

जवाबों:


5

बॉर्न परिवार की शेल भाषाओं में, :कमांड, जो कुछ भी नहीं करती है, आमतौर पर दो स्थितियों में उपयोग की जाती है:

  • प्लेसहोल्डर जब कुछ एक अनिवार्य आदेश की उम्मीद करता है, जैसे

    while some_condtion
    do :
    done

    चूंकि doकम से कम एक आदेश की आवश्यकता है।

  • तर्कों को छोड़ना, लेकिन तर्क सूची के अंदर साइड इफेक्ट्स करना, जैसे

    : ${myvar=foo}

मुझे यकीन है कि शायद अन्य अनुप्रयोग हैं जो शेल विशेषज्ञों को पता होंगे :)

पायथन (और अन्य भाषाओं) में इसका कम इस्तेमाल होता है। जब आप वास्तव में कुछ भी नहीं करना चाहते हैं तो यह एक उच्च-क्रम फ़ंक्शन के तर्क के रूप में कार्य कर सकता है। उदाहरण के लिए, मान लें कि आपके पास एक फ़ंक्शन है जो एक फॉर्म को सबमिट करता है और एक फ़ंक्शन को जमा होने के बाद अतुल्यकालिक रूप से कॉल करने की अनुमति देता है:

def submit(callback=empty_func):
    ...

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


1

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

def full_algo():
  init_stuff()
  process_stuff()
  ...

आप जानते हैं कि यह कैसे init_stuffकाम करेगा, यह आपके सिर में सरल है, लेकिन आपको वास्तव में तुरंत इसकी आवश्यकता नहीं है, इसलिए आप इसे एक खाली फ़ंक्शन के रूप में घोषित करते हैं। यह आपके कोड को संकलित करने और चलाने के लिए अनुमति देगा बिना गोर विवरण के बारे में परेशान किए बिना।

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

init_filesystem();
access_files();
release_filesystem();

यह कोड कई प्लेटफार्मों पर काम करेगा, लेकिन कुछ प्लेटफार्मों को फाइलसिस्टम आरंभीकरण की आवश्यकता नहीं हो सकती है। तब आपकी विरासत इस तरह दिखेगी (C ++ में वर्चुअल = 0 के साथ इसका मतलब है कि व्युत्पन्न वर्ग उन तरीकों को लागू करना होगा):

class FileSystem{
  virtual void init_filesystem() = 0;
  virtual void access_files() = 0;
  virtual void release_filesystem() = 0;
};

फिर इस वर्ग (इंटरफ़ेस) का एक विशेष कार्यान्वयन उन तरीकों में से कुछ के लिए कुछ नहीं कर सकता है। वैकल्पिक रूप से, आधार वर्ग उन्हें आभासी घोषित करने के बजाय init / रिलीज़ के लिए खाली तरीकों की घोषणा कर सकता है।

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


0

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

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


1
अधूरा कोड के लिए, फेंकना NotImplementedErrorएक अधिक पर्याप्त समाधान है क्योंकि "त्रुटियों को कभी भी चुपचाप पारित नहीं करना चाहिए" और लाइव प्रोग्राम में एक अनिमित फ़ंक्शन को कॉल करना एक त्रुटि है।
ivan_pozdeev

वह निर्भर करता है। कोड के लिए आप जहाज, हाँ। लेकिन अगर यह कोड है जिसे आप एक घंटे में लागू करने की उम्मीद करते हैं और आप यूनिट परीक्षणों पर काम करते समय इसे केवल अनइम्प्लीमेंट छोड़ रहे हैं, तो बस बिना किसी कार्यान्वयन के एक बेहतर विकल्प हो सकता है। अक्सर मेरा वर्कफ़्लो 1 होता है) pass 2 के साथ स्टब मेथड लिखिए) यूनिट टेस्ट लिखिए जो टेस्ट वैल्यू 3 लौटाता है) वेरिफाइड टेस्ट फेल हो जाता है (जैसा कि विधि अपरिभाषित है) 4) लागू करने की विधि 5) वेरिफिकेशन टेस्ट अब पास हो गया
रोबोट

0

हालांकि यह ऐसा कुछ नहीं है जो आप पायथन में करने की उम्मीद करेंगे, ऐसे डिवाइस ड्राइवरों की दुनिया में कई बार आपको एक खाली फ़ंक्शन की आपूर्ति करने की आवश्यकता होती है, ताकि किसी भी घटना को संभालने के लिए आपको (ए) पता न चले या () ख) इसके बारे में परवाह नहीं है, भले ही यह करता है।

आप इसे C में कॉलबैक के साथ भी देखते हैं। कभी-कभी, आपको कोड दिखाई देगा कि बस ASSUMES आपको कॉलबैक की आपूर्ति करता है, और इसे कॉल करने की कोशिश करता है, एक अशक्त सूचक के जोखिम को अनदेखा करता है। उस मामले में आप कर सकते हैं एक खाली कॉलबैक दिनचर्या की आपूर्ति है। (हाँ, मैं मन में एक विशेष विक्रेता है।)


मैं passएक प्लेसहोल्डर के रूप में बहुत उपयोग करता था जब कोड लिख रहा था, विशेष रूप से कक्षाओं में, जब मुझे सब कुछ पूरा होने से पहले कुछ चलाने योग्य चाहिए। यह वास्तव में अजगर के के बराबर है {}, जो अजगर के रूप में यह ब्रेसिज़ का उपयोग नहीं करता नहीं कर सकते। उस अर्थ में, सभी भाषाएँ जिन्हें मैं इसके बारे में जानता हूँ, यह सिर्फ इतना है कि केवल एक जोड़े pythonको एक खोजशब्द की आवश्यकता होती है। यहां तक ​​कि विधानसभा के दिनों में भी हमारे पास था NOP
रोबोट

@StevenBurnap, आम तौर पर जब मैं ऐसा ही कुछ करते हैं, मैं printf की स्थानीय समकक्ष ( ">>> दिनचर्या XXX कहा जाता है \ n") शामिल हैं;
जॉन आर। स्ट्रॉहम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.