2012-06-24 17 views
54

मैं आज कोडिंग कर रहा था और कुछ देखा। अगर मैं एक नया दुभाषिया सत्र खोलने (निष्क्रिय) और जाँच क्या dir समारोह मैं इस मिल के साथ परिभाषित किया है:पायथन: __builtin__ और __builtins__ के बीच क्या अंतर है?

$ python 
>>> dir() 
['__builtins__', '__doc__', '__name__', '__package__'] 
>>> dir(__builtins__) 
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BufferError', 'BytesWarning', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'None', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError', 'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'ZeroDivisionError', '_', '__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs', 'all', 'any', 'apply', 'basestring', 'bin', 'bool', 'buffer', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'cmp', 'coerce', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'execfile', 'exit', 'file', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'intern', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'long', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'raw_input', 'reduce', 'reload', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'unichr', 'unicode', 'vars', 'xrange', 'zip'] 
>>> import __builtin__ 
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BufferError', 'BytesWarning', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'None', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError', 'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'ZeroDivisionError', '_', '__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs', 'all', 'any', 'apply', 'basestring', 'bin', 'bool', 'buffer', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'cmp', 'coerce', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'execfile', 'exit', 'file', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'intern', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'long', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'raw_input', 'reduce', 'reload', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'unichr', 'unicode', 'vars', 'xrange', 'zip'] 
>>> dir(__builtin__) == dir(__builtins__) # They seem to have the same things 
True 

अंतिम पंक्ति कृपया ध्यान दें। एक दूसरे के उपनाम के

  • किसी भी है:

    तो, मेरे सवाल है?

  • क्या पाइथन लोग उनमें से किसी से छुटकारा पाने की योजना बना रहे हैं?

  • मुझे अपने कार्यक्रमों के लिए क्या उपयोग करना चाहिए?

  • पायथन 3 के बारे में क्या?

  • कोई भी जानकारी मूल्यवान है!

महत्वपूर्ण:

मैं Ubuntu पर पायथन 2.7.2+ उपयोग कर रहा हूँ।

उत्तर

48

सीधे अजगर प्रलेखन से: http://docs.python.org/reference/executionmodel.html

डिफ़ॉल्ट रूप से, जब __main__ मॉड्यूल में, __builtins__ में निर्मित मॉड्यूल __builtin__ (ध्यान दें: कोई 'एस') है; जब किसी अन्य मॉड्यूल में, __builtins__ __builtin__ मॉड्यूल के शब्दकोश के लिए उपनाम है।

__builtins__ प्रतिबंधित निष्पादन के कमजोर रूप को बनाने के लिए उपयोगकर्ता द्वारा निर्मित शब्दकोश पर सेट किया जा सकता है।

सीपीथन कार्यान्वयन विवरण: उपयोगकर्ताओं को __builtins__ स्पर्श नहीं करना चाहिए; यह सख्ती से एक कार्यान्वयन विस्तार है। उपयोगकर्ता बिल्टिन नेमस्पेस में मानों को ओवरराइड करना चाहते हैं import __builtin__ (नहीं ') मॉड्यूल और इसके गुण उचित रूप से संशोधित करना चाहिए। मॉड्यूल के लिए नामस्थान स्वचालित रूप से बनाया गया है जब मॉड्यूल आयात किया जाता है।

ध्यान दें कि python3 में, मॉड्यूल __builtin__builtins को नाम दिया गया है इस भ्रम में से कुछ से बचने के लिए।

+0

महान जवाब ग्लोबल नेम स्पेस में __builtin__ मॉड्यूल

आयात __builtin__, बहुत बहुत शुक्रिया। क्या आप पाइथन 3 के बारे में कुछ जानते हैं? – santiagobasulto

+8

जैसा कि अन्य उत्तरों ने कहा है कि यह '__builtin__' मॉड्यूल को छोड़कर पायथन 3 के लिए समान है, को "अंतर्निहित" (अंडरस्कोर के बिना) का नाम दिया गया है। http://docs.python.org/dev/reference/executionmodel.html – akent

6

__builtin__ एक मॉड्यूल है जिसमें अंतर्निहित फ़ंक्शंस और प्रकार हैं। तथ्य यह है कि एक नाम __builtins__ उपलब्ध है जिसमें एक ही चीज एक कार्यान्वयन विस्तार है। दूसरे शब्दों में, यदि आपको उनमें से किसी एक का उपयोग करने की आवश्यकता है, तो import __builtin__ करें और फिर __builtin__ का उपयोग करें। the documentation देखें।

17

आपको अपने कार्यक्रमों में __builtin__ का उपयोग करना चाहिए (दुर्लभ मामलों में आपको इसकी आवश्यकता है), क्योंकि __builtins__ सीपीथन का कार्यान्वयन विवरण है।संदर्भ के आधार पर यह या तो __builtin__, या __builtin__.__dict__ के समान हो सकता है। the documentation कहते हैं:

अधिकांश मॉड्यूल नाम __builtins__ (ध्यान दें 'एस') अपने वैश्विक के हिस्से के रूप से उपलब्ध कराया है। __builtins__ का मान सामान्यतः या तो इस मॉड्यूल या इस मॉड्यूल के __dict__ विशेषता का मान है। चूंकि यह एक कार्यान्वयन विस्तार है, इसलिए इसका उपयोग पायथन के वैकल्पिक कार्यान्वयन द्वारा नहीं किया जा सकता है।

अजगर 3 में, __builtin__builtins को नाम दिया गया है, और __builtins__ ही रहता है (ताकि आप केवल अजगर 3 में builtins का उपयोग करना चाहिए)।

गुइडो __builtin__ और __builtins__ एकजुट करने के लिए चाहता था, जैसा कि आप here ("__builtins__ और __builtin__ होने दोनों स्पष्ट रूप से एक बुरा विचार है।") देख सकते हैं, लेकिन जाहिरा तौर पर कुछ भी नहीं आया था।

स्पष्ट रूप से __builtins__ का उपयोग प्रदर्शन के लिए है - यह गैर-मुख्य मॉड्यूल में उपयोग किए जाने पर __builtin__.__dict__ तक सीधे पहुंच प्रदान करता है, और इसलिए एक स्तर का संकेत हटा देता है।

1

आप इन्हें निम्नलिखित कोड की तरह समझ सकते हैं। जब CPython शुरू कर दिया है, CPython भार के रूप में __builtins__

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