2011-06-01 11 views
20

क्या यह पाइथन में एक अच्छा अभ्यास है (Active State Recipes -- Public Decorator से)?क्या सजावट का उपयोग कर __all__ में नाम जोड़ने का अच्छा अभ्यास है?

import sys 

def public(f): 
    """Use a decorator to avoid retyping function/class names. 

    * Based on an idea by Duncan Booth: 
    http://groups.google.com/group/comp.lang.python/msg/11cbb03e09611b8a 
    * Improved via a suggestion by Dave Angel: 
    http://groups.google.com/group/comp.lang.python/msg/3d400fb22d8a42e1 
    """ 
    all = sys.modules[f.__module__].__dict__.setdefault('__all__', []) 
    if f.__name__ not in all: # Prevent duplicates if run from an IDE. 
     all.append(f.__name__) 
    return f 

public(public) # Emulate decorating ourself 

सामान्य विचार एक डेकोरेटर कि एक समारोह या वर्ग लेता है और वर्तमान मॉड्यूल के __all__ के लिए इसका नाम कहते हैं परिभाषित करने के लिए किया जाएगा।

+2

शीर्षक फिक्स्ड, के रूप में कुछ लोगों को –

+0

ने बताया कि यह एक अच्छा विचार की तरह लगता है, मुझे लगता है कि यह मेरे आईडीई (PyCharm 2016/01/04), जो ज्यादातर उद्देश्य धरा confuses। पर्याप्त आईडीई समर्थन देखते हुए, मैं इसका इस्तेमाल करूंगा। –

+0

इस डेकोरेटर 100% बुलेट प्रूफ हो रही कठिन प्रतीत होता है: देखें [अजगर बग # 26,632] (https://bugs.python.org/issue26632) और [ 'atpublic' मॉड्यूल] (https: // pypi। python.org/pypi/atpublic) ने उल्लेख किया है। – kostix

उत्तर

6

हां, यह एक अच्छा अभ्यास है। यह सजावट आपको सीधे अपने बाद के बजाय कार्य या कक्षा परिभाषा पर अपने इरादों को बताने की अनुमति देता है। इससे आपका कोड अधिक पठनीय हो जाता है।

@public 
def foo(): 
    pass 

@public 
class bar(): 
    pass 

class helper(): # not part of the modules public interface! 
    pass 

नोट:helper अभी भी modulename.helper द्वारा मॉड्यूल का एक उपयोगकर्ता के लिए सुलभ है। यह सिर्फ from modulename import * के साथ आयात नहीं किया गया है। (

def public(x): 
     ... 


def _private_helper(y): 
    ... 

अधिक लोग इस शैली से परिचित हो जाएगा जो भी द्वारा समर्थित है:

+7

मैं जरूरी नहीं कहूंगा कि यह एक अच्छा अभ्यास है। एक मॉड्यूल की शुरुआत में स्पष्ट रूप से परिभाषित '__all__' होने का लाभ यह है कि कोई भी (संभवतः आप) इसे देखकर आसानी से निर्धारित कर सकता है कि' आयात * 'के माध्यम से क्या निर्यात किया जाता है और मॉड्यूल के सार्वजनिक एपीआई का हिस्सा क्या है। एक सार्वजनिक सज्जाकार का उपयोग करना यह और अधिक कठिन बनाता है। हालांकि, यदि आप एक सजावट का उपयोग करते हैं, तो आप मॉड्यूल के सदस्य को देखते हुए बता सकते हैं कि यह '__all__' में है या नहीं। तो दोनों के पास उनके संबंधित पेशेवर और विपक्ष हैं। – darkfeline

+0

सबकुछ अंधेरे रेखा ने प्लस कहा - यह निष्क्रिय कोड टोकननाइज़र के साथ आईडीई पर इंटेलिजेंस/कोड-पूर्णता को तोड़ता है। – synthesizerpatel

1

यह स्वचालित रूप से __all__ पर नाम नहीं जोड़ता है, यह आपको @public के साथ सजाने के लिए सभी को एक फ़ंक्शन जोड़ने की अनुमति देता है। मुझे एक अच्छा विचार लगता है।

+0

स्वचालित रूप से, मैं मूल रूप से सूची में नाम टाइप कर रहा हूं w/o स्पष्ट रूप से –

+1

हां। (जाने के लिए 11 और वर्ण) – LaC

1

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

नोट: प्रश्न के शीर्षक भ्रामक है के रूप में दूसरों को पहले से ही जवाब के बीच में देखा है।

17

अजगर में यह करने के लिए अधिक मुहावरेदार तरह से एक अंडरस्कोर से उनके नाम शुरू करने से निजी रूप में निजी कार्यों को चिह्नित करने के लिए है भाषा: आपके public सजावट के मुकाबले __all__ का उपयोग नहीं करते हैं, भले ही निर्यात नहीं किया जाएगा।

+2

यह सजावटी हल करने की समस्या का समाधान नहीं करता है: नामों को '__all__' में अद्यतित रखना। –

+4

@EdL ऐसा इसलिए है क्योंकि यदि आप लगातार "निजी" चीजों के लिए अंडरस्कोर का उपयोग करते हैं और सार्वजनिक चीजों के लिए कोई अंडरस्कोर नहीं करते हैं, तो आपको सभी –

+1

@TobiasKienzler पर '__all__' की आवश्यकता नहीं होगी, क्या कोई आयातित मॉड्यूल निर्यात नहीं किया जाएगा? आप शायद अभी भी उनको अवरुद्ध करना चाहते हैं। –

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