2011-11-29 32 views
6

एक अजगर समारोह का दस्तावेजीकरण में, मैं यह कहना अधिक pythonic लगता है:पायथन दस्तावेज: कई बार पुन: प्रयोज्य?

def Foo(i): 
    """i: An interable containing…""" 

... बजाय ...

def Foo(i): 
    """i: A list of …""" 

जब i वास्तव में एक list होने की जरूरत नहीं है। (Foo खुशी से, एक set, tuple पर कार्यवाही करेंगे आदि) समस्या जनरेटर है। जनरेटर आमतौर पर केवल 1 पुनरावृत्ति की अनुमति देते हैं। अधिकांश कार्यों जनरेटर या iterables कि केवल एक ही पास की अनुमति देने के साथ ठीक हैं, लेकिन कुछ नहीं कर रहे हैं।

उन कार्यों के लिए जो जेनरेटर/चीजों को स्वीकार नहीं कर सकते हैं जिन्हें केवल एक बार फिर से चालू किया जा सकता है, क्या एक स्पष्ट, लगातार पायथन शब्द कहने के लिए "चीज जिसे केवल एक से अधिक बार फिर से चालू किया जा सकता है"?

iterable और iterator के लिए पायथन शब्दावली "एक बार, लेकिन शायद आप भाग्यशाली हैं" परिभाषा प्रतीत होती है।

+1

एक "संग्रह"? ऐसा लगता है कि यहां सभी उदाहरण प्रकारों का वर्णन किया गया है। कंटेनर के उपयोग के लिए – ephemient

+0

+1, जो कि सबसे संक्षिप्त तरीके से अंतर्निहित विचार को कैप्चर करने लगता है, लेकिन ... मुझे नहीं लगता कि मैंने किसी भी पायथन दस्तावेज़ में "कंटेनर" देखा है? –

+1

एक कंटेनर एक ऑब्जेक्ट है जो '__contains __()' विधि है, जो न तो आवश्यक है और न ही पुन: प्रयोज्य पुन: प्रयोज्य के लिए पर्याप्त है। http://docs.python.org/library/collections.html#collections.Container –

उत्तर

2

मैं इस के लिए एक मानक अवधि के, कम से कम बेतकल्लुफ़ नहीं पता नहीं है, लेकिन मुझे लगता है "पुन: प्रयोज्य iterable" यदि आप एक छोटे वाक्यांश जरूरत भर बिंदु मिलेगा।

व्यवहार में, यह आम तौर पर अपने कार्य की संरचना करने के लिए संभव है, ताकि आप एक बार से i पर अधिक पुनरावृति की जरूरत नहीं है। वैकल्पिक रूप से, आप पुनरावर्तनीय से एक सूची बना सकते हैं और फिर जितनी बार चाहें सूची में फिर से शुरू कर सकते हैं; या आप इटरेटर की कई स्वतंत्र "प्रतियां" प्राप्त करने के लिए itertools.tee का उपयोग कर सकते हैं। इससे आपको जनरेटर को स्वीकार करने की सुविधा मिलती है, भले ही आपको इसे एक से अधिक बार उपयोग करने की आवश्यकता हो।

+1

ध्यान दें कि, जैसा कि [docs] में बताया गया है (https://docs.python.org/3/library/itertools.html# itertools.tee), "सामान्य रूप से, यदि एक पुनरावर्तक किसी अन्य पुनरावर्तक से पहले अधिकांश या सभी डेटा का उपयोग करता है, तो tee() के बजाय सूची() का उपयोग करना तेज़ है।" उस स्थिति में, 'टीई() 'सामग्री को कई बार प्रतिलिपि/स्टोर करेगा जबकि' सूची()' केवल इसे एक बार स्टोर करेगा। – waterproof

1

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

उदाहरण: अगर मैं एक समारोह है कि एक शब्दकोश की चाबियाँ पर जाने के लिए और अपने मूल्यों को मैं लिखने की अनदेखी करने की उम्मीद ने लिखा है:

arg : a dictionary of... 

भी for e in arg: यदि अन्य iterables साथ काम करेगा। मैं ऐसा करने के लिए चुना है, क्योंकि मेरे कोड के संदर्भ में, मुझे परवाह नहीं है अगर समारोह अभी भी काम करेगा ... मैं और अधिक परवाह जो कोई पढ़ता प्रलेखन समझते हैं कि कैसे है कि समारोह मतलब है प्रयोग की जाने वाली।

दूसरी ओर, अगर मैं एक उपयोगिता समारोह है कि डिजाइन द्वारा iterables के एक व्यापक स्पेक्ट्रम के साथ सामना कर सकते हैं लिख रहा हूँ, मैं इन दो तरीकों में से एक जाना:

  1. दस्तावेज़ अपवाद किस तरह का कतिपय शर्तों के अधीन गुलाब किया जाएगा [पूर्व: "लेखन त्रुटि उठाएँ अगर iterable एक बार से अधिक दोहराया नहीं किया जा सकता"]
  2. कि समारोह के साथ संगत कर देगा कुछ पूर्व रिक्तिपूर्व तर्क से निपटने के लिए प्रदर्शन 'केवल एकमात्र' iterables।

दूसरे शब्दों में, मैं या तो करने की कोशिश मेरी समारोह पर्याप्त ठोस बढ़त मामलों को संभालने के लिए कर सकते हैं या अपनी सीमाएं पर बहुत मुखर होने के लिए।

दोबारा: उस दृष्टिकोण के साथ कुछ भी गलत नहीं है जिसे आप लेना चाहते हैं, लेकिन मैं उन मामलों में से एक मानता हूं जिनमें "explicit is better than implicit": एक दस्तावेज जिसमें "पुन: प्रयोज्य पुनरावर्तनीय" का उल्लेख किया गया है, निश्चित रूप से सटीक है, लेकिन विशेषण आसानी से हो सकता है अनदेखा किया जाना चाहिए।

HTH!

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