python - पायथन आयात 3.4.6 और 3.5.2 के बीच अलग-अलग



import python-internals (1)

दस्तावेज बताते हैं कि

जब spam नामित एक मॉड्यूल आयात किया जाता है, तो इंटरप्रिटर पहले उस नाम के साथ एक अंतर्निहित मॉड्यूल की खोज करता है । यदि नहीं मिला, तो यह चर sys.path द्वारा दी गई निर्देशिकाओं की सूची में sys.path . sys.path नामक एक फ़ाइल की खोज sys.path

(जोर मेरा)

time पायथन 3.4 में एक अंतर्निहित मॉड्यूल मॉड्यूल नहीं था, लेकिन वह पायथन 3.5 में बदल गया था:

[email protected]:~$ python3.4 -c 'import sys; print("time" in sys.builtin_module_names)'
False
[email protected]:~$ python3.5 -c 'import sys; print("time" in sys.builtin_module_names)'
True

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

चूंकि time sys.path 3.4 में एक अंतर्निहित मॉड्यूल नहीं है, और sys.path में पहली निर्देशिका वर्तमान स्क्रिप्ट निर्देशिका है, from time import time से आपके time.py फ़ाइल से time विशेषता आयात करने का प्रयास करता है, लेकिन विफल रहता है और फेंकता है ImportError

CPython 3.5 time में एक अंतर्निहित मॉड्यूल है। उपरोक्त उद्धरण के अनुसार, from time import time चलने from time import time sys.path पर मॉड्यूल की खोज किए बिना, अंतर्निहित मॉड्यूल को सफलतापूर्वक आयात किया sys.path

दोनों CPython संस्करण एक ही त्रुटि को बढ़ा देंगे यदि आप मानक लाइब्रेरी से एक गैर-बिल्टिन मॉड्यूल छायांकित करते हैं, जैसे कि inspect :

[email protected]:~$ cat inspect.py 
from inspect import signature
[email protected]:~$ python3.4 -c 'import inspect'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/home/me/inspect.py", line 1, in <module>
    from inspect import signature
ImportError: cannot import name 'signature'
[email protected]:~$ python3.5 -c 'import inspect'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/home/me/inspect.py", line 1, in <module>
    from inspect import signature
ImportError: cannot import name 'signature'

संस्करण 3.4.6 और 3.5.2 के बीच अलग-अलग पाइथन आयात को छिपने लगता है:

$ cat time.py
from time import time
$ pyenv global 3.4.6
$ python -V
Python 3.4.6
$ python time.py 
Traceback (most recent call last):
  File "time.py", line 1, in <module>
    from time import time
  File "/home/vagrant/tmp/time.py", line 1, in <module>
    from time import time
ImportError: cannot import name 'time'
$ pyenv global 3.5.2 
$ python -V
Python 3.5.2
$ python time.py
$ echo no error
no error

प्रश्न 1: क्यों ये बातें हैं?

प्रश्न 2: क्या इसके बारे में एक चैंज में कुछ है? मुझे कुछ भी नहीं मिला ...





shadowing