2009-02-15 7 views
7

C++ में आप अक्सर काफी अपने कोड की पठनीयता "का उपयोग" कीवर्ड से सावधान उपयोग द्वारा उदाहरण के लिए सुधार कर सकते हैं,:क्या पाइथन में सी ++ का उपयोग करने वाले कीवर्ड की तरह कुछ है?

void foo() 
{ 
    std::vector< std::map <int, std::string> > crazyVector; 
    std::cout << crazyVector[0].begin()->first; 
} 

हो जाता है

void foo() 
{ 
    using namespace std; // limited in scope to foo 
    vector< map <int, string> > crazyVector; 
    cout << crazyVector[0].begin()->first; 
} 

अजगर के लिए कुछ इसी तरह मौजूद है, या क्या मुझे सबकुछ पूरी तरह अर्हता प्राप्त करनी है?

मैं अस्वीकरण जोड़ दूंगा जो मुझे पता है कि इसका उपयोग करने से इसका नुकसान होता है और इसे उचित रूप से सीमित किया जाना चाहिए।

उत्तर

19

के रूप में बिल ने कहा, अजगर निर्माण

from X import * 

है, लेकिन आप भी कर सकते हैं स्पष्ट रूप से निर्दिष्ट जो नाम आप मॉड्यूल (नाम स्थान) से आयात करना चाहते हैं:

from X import foo, bar, blah 

इस स्रोत में एक पहचानकर्ता n नहीं देख रही है, कोड और भी अधिक पठनीय/समझने में अधिक आसान बनाने के लिए जाता है किसी के बाद से यह देखने के लिए कि यह कहां से आता है, सभी आयातित मॉड्यूल के माध्यम से शिकार करने के लिए ईद। Namespace Specification In Absence of Ambuguity

संपादित:: यहाँ एक संबंधित सवाल है पैक्स की टिप्पणी के जवाब में, मैं उल्लेख करेंगे कि आप भी

import X.foo 

तरह बातें लिख सकते हैं, लेकिन फिर आप लिखने के लिए की आवश्यकता होगी

X.foo.moo() 

के बजाय सिर्फ

foo.moo() 

यह निश्चित रूप से एक बुरी बात नहीं है। मैं आमतौर पर from X import y और import X.y रूपों का मिश्रण उपयोग करता हूं, जो भी मुझे लगता है कि मेरा कोड साफ़ हो जाता है। यह निश्चित रूप से कुछ हद तक एक व्यक्तिपरक चीज है।

+0

आप इसे "आयात एक्स" शामिल करने के लिए विस्तारित करना चाहते हैं जो आपको उस मॉड्यूल से X.y चीजों का उपयोग करने की अनुमति देता है। मैं कभी-कभी नामस्थान को प्रदूषित करने के लिए इसे प्राथमिकता देता हूं। – paxdiablo

+0

अच्छी कॉल, किया गया ;-) –

+1

क्यों "सी ++ के विपरीत"? क्या आप "std :: string;" का उपयोग नहीं कर सकते? – Constantin

6
import X 

या

from X import * 

या

from X import a, b, c 

कहाँ एक्स पायथन मॉड्यूल का उपयोग करना चाहते है।

यह आपके लिए एक पाइथन कोड नमूना देने में मददगार होगा जो आपको लगता है कि साफ करने की आवश्यकता है।

5

निश्चित रूप से, पायथन की गतिशीलता यह तुच्छ बनाता है। यदि आप एक वर्ग एक नाम स्थान में गहरी दफनाया गया था: foo.bar.baz.blah, आप कर सकते हैं:

def foo: 
    f = foo.bar.baz.blah 
    f1 = f() 
0

ध्यान दें कि

from foo import bar 

काम करता है, भले ही barfoo पैकेज में एक मॉड्यूल है।यह आपको foo.bar में प्रत्येक फ़ंक्शन/क्लास का नाम दिए बिना अपने नेमस्पेस प्रदूषण को सीमित करने देता है, जिसका उपयोग आप कर सकते हैं। यह आपके कोड के पाठकों को भी सहायता प्रदान करता है, क्योंकि उन्हें bar.baz() पर कॉल दिखाई देगी और एक बेहतर विचार होगा जहां baz आया था।

1

डेविड के जवाब के अलावा:

  1. एक PEP8 की खातिर from X import (foo, bar, blah) में गोल कोष्ठक का उपयोग करना चाहिए।
  2. पूर्ण वाक्यविन्यास from foo import bar as baz में वर्तमान मॉड्यूल के दायरे में अपने नए पहचानकर्ताओं को पैकेज नामों का नाम बदलने (पुन: बाध्य करने) की अनुमति देता है।

मैं sys.modules आगे के रूप में पढ़ने के लिए import keyword के लिए मैनुअल, __import__ निर्मित और विवरण देखने के लिए सलाह देते हैं।

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