अजगर जनरेटर और फ़ंक्शंस "डीएफ़" कीवर्ड क्यों साझा करते हैं?


10

निम्नलिखित को धयान मे रखते हुए:

def some_function():
    return 1

def some_generator():
    yield 1

उपरोक्त कोड में, some_functionएक फ़ंक्शन है, जबकि some_generatorएक जनरेटर है। वे काफी समान दिखते हैं।

कोड पढ़ते समय मेरे पास जो समस्या है वह यह है कि मुझे "फ़ंक्शन" में प्रत्येक पंक्ति के माध्यम से स्कैन करना होगा जो yieldकीवर्ड की तलाश में है, इससे पहले कि मैं यह निर्धारित कर सकूं कि यह वास्तव में एक फ़ंक्शन या जनरेटर है!

यह सिर्फ मुझे लगता है कि जनरेटर के लिए एक अलग कीवर्ड का उपयोग करने से अधिक समझ होगी, जैसे:

gen some_generator():
    yield 1

defजनरेटर और कार्यों दोनों के लिए कीवर्ड का उपयोग करने की योग्यता क्या है ? अलग कार्यों और जनरेटर के लिए एक नया कीवर्ड क्यों नहीं पेश किया गया है?


मुझे वास्तविक उत्तर नहीं पता है, लेकिन मैं अक्सर सूची लिखने वाले कार्यों को शुरू करता हूं, फिर जब यह सही लगता है तो जनरेटर में बदल देते हैं। वाक्यविन्यास मिलान होने से यह अधिक स्वाभाविक हो जाता है।
रोबोट

2
@StevenBurnap डेरेक के सुझाव के genबजाय कुछ का उपयोग करने की तरह defयह परिवर्तन बहुत अधिक महत्वपूर्ण नहीं होगा।
jamesdlin

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

@jamesdlin: लेकिन सवाल यह है कि एक नया कीवर्ड आवश्यक होगा ।
जियोर्जियो

1
@jamesdlin: बेशक आप उनके शरीर को देखकर फ़ंक्शंस और जनरेटर को अलग कर सकते हैं, लेकिन सवाल यह है कि विभिन्न कीवर्ड्स का उपयोग करने से कोड अधिक पठनीय बन जाएगा।
जियोर्जियो

जवाबों:


14

"जनरेटर और फ़ंक्शंस दोनों के लिए डिफॉल्ट कीवर्ड का उपयोग करने के गुण क्या हैं?"

हालांकि वे यंत्रवत् रूप से भिन्न होते हैं, जब मैं उनका उपयोग करता हूं तो वे वैचारिक रूप से मेरे लिए समान रूप से प्रभावी होते हैं (मुझे कॉलिंग range()बनाम काफ़ी नहीं लगता xrange())।

यह समझने के संदर्भ में कि फ़ंक्शन सभी के बारे में क्या है हालांकि, मैं मानता हूं कि कुछ का उपयोग करने के साथ खो गया है def, लेकिन चीजों को शुरू करने के लिए फ़ंक्शन के भीतर बहुत अधिक बाधित नहीं होना चाहिए।

यहां तक ​​कि एक निहित return Noneएक सशर्त के लंबे समय के बाद किसी फ़ंक्शन के इच्छित व्यवहार को भ्रमित कर सकता है (जैसा कि, return Noneएक अंतिम व्यवहार या तर्क में एक निरीक्षण के रूप में एक इरादा था )। लेकिन वे सिर्फ इसके बारे में मेरा विश्वास हैं।

मुझे नहीं लगता कि मेरा तर्क विशेष रूप से आश्वस्त है, इसलिए मैं सिर्फ पीईपी 255 को टाल दूंगा :

समस्या: एक अन्य नए कीवर्ड ("जीन" या "जनरेटर") को "डीफ़" के स्थान पर प्रस्तुत करें, या अन्यथा गैर-जनरेटर फ़ंक्शंस से जनरेटर-फ़ंक्शंस को अलग करने के लिए सिंटैक्स को बदलें।

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

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

BDFL: "डीफ़" यह रहता है। दोनों तरफ कोई तर्क पूरी तरह से आश्वस्त नहीं है, इसलिए मैंने अपनी भाषा डिजाइनर के अंतर्ज्ञान से परामर्श किया है। यह मुझे बताता है कि पीईपी में प्रस्तावित वाक्यविन्यास बिल्कुल सही है - बहुत गर्म नहीं, बहुत ठंडा नहीं। लेकिन, ग्रीक पौराणिक कथाओं में डेल्फी पर ओरेकल की तरह, यह मुझे नहीं बताता है, इसलिए मेरे पास पीईपी सिंटैक्स के खिलाफ तर्कों के लिए खंडन नहीं है। सबसे अच्छा मैं साथ आ सकता हूं (इसके अलावा खंडन से सहमत होने के साथ ... पहले से ही बना हुआ) "एफयूडी" है। यदि यह पहले दिन से भाषा का हिस्सा होता, तो मुझे बहुत संदेह है कि इसने एंड्रयू कुचलिंग का "पायथन वार्ट्स" पृष्ठ बना दिया।


1
यह ध्यान देने योग्य है कि नए लायक है await(और async withऔर async for) वाक्य रचना निर्माणों में जोड़ा पीईपी 492 जो बहुत के समान काम करते हैं, yield from, समारोह वे में उपयोग करते हुए घोषित किया जा करने के लिए इस्तेमाल कर रहे हैं की आवश्यकता होती है async defएक बस के बजाय def
फ़्यूएर्मुरमेल

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

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


1

जनरेटर वे कार्य हैं जो आलसी का मूल्यांकन करते हैं। यह देखते हुए कि वे आधार में एक ही चीज हैं, यह समझ में आता है कि वे एक ही कीवर्ड का उपयोग करेंगे। एक विकल्प यह बताने के लिए एक टिप्पणी का उपयोग करने के लिए हो सकता है कि किसी दिए गए उदाहरण के लिए कौन है:

def some_function(): #This is a function.
    return 1

def some_generator(): #This is a generator.
    yield 1

0

मुझे लगता है कि यह है क्योंकि यह अधिक पायथोनिक है, लेकिन मुझे क्या पता है? ;)

मैं वास्तव में नहीं सोचता कि यह सब बहुत मायने रखता है। मेरे लिए याद रखना आसान है क्योंकि उन दोनों को याद करने की कोई जरूरत नहीं है।

संपादित करें: पीईपी कह सकता है, आप वहां जांच कर सकते हैं।


धन्यवाद! वास्तव में, PEP कहता है! जनरेटर के लिए एक नए कीवर्ड के बारे में पेशेवरों / विपक्ष और अंतिम निर्णय के लिए PEP-255 देखें ।
डेरेक क्वोक

पायथोनिक अर्थ के साथ: "जिस तरह से यह पायथन में किया जाता है"?
जियोर्जियो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.