2015-06-15 14 views
5

सी और सी ++ जैसी भाषाओं में फ़ंक्शंस का क्रम, आगे की घोषणाओं की आवश्यकता से बचने के लिए, उनके कॉलर्स के ऊपर दिए गए कार्यों को परिभाषित करना आम बात है। उदाहरण के लिए:एक पायथन स्रोत फ़ाइल

void g() { ... } 

void f() { g(); ... } 

int main() { f(); ... } 

अजगर में, यदि

if __name__ == '__main__': 
    main() 

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

क्या कोई पाइथन स्रोत फ़ाइल के भीतर कार्यों के क्रम के लिए कोई सम्मेलन है? आमतौर पर कॉलर्स के ऊपर लिखे गए कार्यों को कहा जाता है, या इसके विपरीत?

संपादित करें: उत्तर यह है कि फ़ंक्शन ऑर्डर के संबंध में कोई सम्मेलन नहीं है (उदाहरण के लिए, पीईपी 8 में कुछ भी नहीं है)। मानक पुस्तकालय के भीतर भी मॉड्यूल असंगत हैं।

+3

पायथन * में * कार्यों का क्रम * मायने रखता है। आप इसे परिभाषित करने से पहले एक फ़ंक्शन को कॉल नहीं कर सकते हैं। सी और सी ++ में आपको इसे कॉल करने से पहले फ़ंक्शन घोषित करना चाहिए, या तो आप जिस तरह से दिखाते हैं या प्रोटोटाइप का उपयोग कर सकते हैं। पायथन प्रोटोटाइप का समर्थन नहीं करता है। – cdarke

+0

आम तौर पर यह कक्षाएं होती है, फिर कार्य करती है, फिर "बेयर" कोड। – Zizouz212

+2

मैं इस प्रश्न को ऑफ-विषय के रूप में बंद करने के लिए मतदान कर रहा हूं क्योंकि इसका उत्तर सीधे उत्पाद प्रलेखन – KevinDTimm

उत्तर

3

स्थाई रूप से टाइप की गई भाषाओं के लिए, किसी ऑब्जेक्ट के प्रकार को निर्धारित करने के लिए इसकी परिभाषा को देखने के लिए पर्याप्त है। हालांकि, यदि परिभाषा के उपयोग के बाद परिभाषा प्रकट होती है, तो दो पास की आवश्यकता होगी: 1) ऐसी वस्तुओं के प्रकार निर्धारित करें, 2) ज्ञात प्रकार का उपयोग करके संकलित करें। यदि परिभाषा किसी अन्य फ़ाइल में थी, तो उसे पास 2 से पहले भी पार्स किया जाना होगा। यह किसी ऑब्जेक्ट/प्रकार को घोषित करने के लिए घोषित करना है (इसके कंपाइलर को मौजूद है और इसके प्रकार के बारे में बताएं) इसके उपयोग से पहले। यह संकलन करने के लिए पर्याप्त है। वास्तविक परिभाषा केवल वस्तु के लिए स्थान आरक्षित करता है और वास्तविक कोड (अधिकतर) उत्पन्न करने की आवश्यकता नहीं है - यही घोषणा है। (याद रखें: इस तरह के अधिकांश लैंगोएज उचित दोनों को गठबंधन करने की अनुमति देते हैं)।

अजगर में, एक गतिशील टाइप किया भाषा, वस्तु (मूल्य और प्रकार) एक नाम संदर्भ (!) नियंत्रण प्रवाह द्वारा अपने वास्तविक उपयोग से पहले किसी भी समय बदल सकते हैं, तो के रूप में यह अपने वास्तविक से पहले यह सत्यापित करने के लिए बेकार है उपयोग।

def f(): 
    g() 

def g(): 
    pass 

f() 

कि लग सकता है के रूप में अगर controverts "को परिभाषित पहले 'की नीति:

निम्नलिखित पर विचार करें। लेकिन वास्तव में यह नहीं है, g() केवल तभी आवश्यक होगा जब f() वास्तव में निष्पादित हो रहा है। यह अंतिम पंक्ति (f()) से पहले नहीं है, जिस पर g() बहुत अच्छी तरह से परिभाषित है।

+6

एक डरावना वह है जो डाउनवोट करता है, लेकिन कोई टिप्पणी नहीं छोड़ता है। – Olaf

+1

डाउनवॉटर नहीं, लेकिन मुझे लगता है कि कुछ लोगों ने ऐसा किया क्योंकि आपकी पोस्ट ने सम्मेलन के सवाल को संबोधित नहीं किया था। उस मामले के लिए, मैं फ़ंक्शन परिभाषाओं को व्यवस्थित करना चाहता हूं क्योंकि कोई सी में होगा, क्योंकि मेरे अनुभव में यह नेविगेटिंग कोड को आसान बनाता है। – MarkM

+1

@ मार्कम मैं बहुत अच्छी तरह से प्रश्न का समाधान करता हूं। ओपी एक सम्मेलन के लिए पूछता है और (अप्रत्यक्ष रूप से) यह अभी भी उपयोग से पहले परिभाषा के बिना क्यों काम करता है। मैं दोनों को संबोधित करता हूं, क्योंकि कोई सम्मेलन नहीं है और मैं समझता हूं कि _why_ की कोई ज़रूरत नहीं है (resp। क्या भिन्न है)। यदि आप सी (पास्कल इत्यादि) का उपयोग करते हैं (तो मैं करता हूं), यह एक राय है, कोई सामान्य सम्मेलन नहीं है और स्टैक ओवरफ़्लो के लिए स्वीकार्य नहीं है (पढ़ें [पूछो]। इसलिए मैं पृष्ठभूमि पर ध्यान केंद्रित करता हूं, राय नहीं। – Olaf

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