आयात विवरण python3 में परिवर्तन


177

मैं pep-0404 से निम्नलिखित नहीं समझता

पायथन 3 में, पैकेज के भीतर निहित सापेक्ष आयात अब उपलब्ध नहीं हैं - केवल पूर्ण आयात और स्पष्ट सापेक्ष आयात समर्थित हैं। इसके अलावा, स्टार आयात (जैसे x आयात * से) केवल मॉड्यूल स्तर कोड में अनुमत हैं।

एक रिश्तेदार आयात क्या है? Python2 में अन्य किन स्थानों पर स्टार आयात की अनुमति थी? कृपया उदाहरण सहित स्पष्ट करें।

जवाबों:


277

जब भी आप वर्तमान स्क्रिप्ट / पैकेज के सापेक्ष पैकेज आयात कर रहे होते हैं तो सापेक्ष आयात होता है।

उदाहरण के लिए निम्नलिखित पेड़ पर विचार करें:

mypkg
├── base.py
└── derived.py

अब, आपकी derived.pyआवश्यकता कुछ से है base.py। पायथन 2 में, आप इसे इस तरह से कर सकते हैं (इन derived.py):

from base import BaseThing

अजगर 3 अब इसका समर्थन नहीं करता है क्योंकि यह स्पष्ट नहीं है कि आप 'रिश्तेदार' या 'निरपेक्ष' चाहते हैं base। दूसरे शब्दों में, अगर baseसिस्टम में एक पायथन पैकेज स्थापित किया गया था, तो आपको गलत नाम मिलेगा।

इसके बजाय आपको स्पष्ट आयात का उपयोग करने की आवश्यकता होती है जो स्पष्ट रूप से एक पथ-समान आधार पर एक मॉड्यूल का स्थान निर्दिष्ट करता है । आपकी derived.pyतरह दिखेगा:

from .base import BaseThing

प्रमुख .कहते हैं ' baseमॉड्यूल निर्देशिका से आयात '; दूसरे शब्दों में, .baseनक्शे ./base.py

इसी तरह, ..उपसर्ग है जो निर्देशिका पदानुक्रम की तरह ऊपर जाता है ../( ..modमानचित्रण के साथ ../mod.py), और फिर ...जो दो स्तर ऊपर ( ../../mod.py) और इतने पर जाता है।

हालांकि, कृपया ध्यान दें कि ऊपर सूचीबद्ध पथ निर्देशिका के सापेक्ष थे जहां वर्तमान मॉड्यूल ( derived.py) में रहता है, कि वर्तमान कार्यशील निर्देशिका में।


@BrenBarn ने पहले ही स्टार आयात मामले की व्याख्या कर दी है। पूर्णता के लिए, मुझे वही कहना होगा;)

उदाहरण के लिए, आपको कुछ mathफ़ंक्शन का उपयोग करने की आवश्यकता है लेकिन आप उन्हें केवल एक फ़ंक्शन में उपयोग करते हैं। पायथन 2 में आपको अर्ध-आलसी होने की अनुमति थी:

def sin_degrees(x):
    from math import *
    return sin(degrees(x))

ध्यान दें कि यह पहले से ही पायथन 2 में एक चेतावनी को ट्रिगर करता है:

a.py:1: SyntaxWarning: import * only allowed at module level
  def sin_degrees(x):

आधुनिक पायथन 2 कोड में आपको और पायथन 3 में आपको या तो करना होगा:

def sin_degrees(x):
    from math import sin, degrees
    return sin(degrees(x))

या:

from math import *

def sin_degrees(x):
    return sin(degrees(x))

14

रिश्तेदार आयात के लिए प्रलेखन देखें । जब आप किसी मॉड्यूल से उस मॉड्यूल के स्थान के सापेक्ष आयात करते हैं, तो इसके बजाय एक रिश्तेदार आयात होता है sys.path

import *उदाहरण के लिए , पायथन 2 ने कार्यों के भीतर स्टार आयात की अनुमति दी:

>>> def f():
...     from math import *
...     print sqrt

पाइथन 2 (कम से कम हाल के संस्करणों) में इसके लिए चेतावनी जारी की गई है। पायथन 3 में अब इसकी अनुमति नहीं है और आप केवल एक मॉड्यूल के शीर्ष स्तर पर स्टार आयात कर सकते हैं (कार्यों या कक्षाओं के अंदर नहीं)।


6
वह निर्णय क्यों किया गया?
डोर

1
मेरा अनुमान है कि इसके पीछे विचार यह है कि 'निहितार्थ की तुलना में स्पष्टीकरण बेहतर है।' PEP20 से - पायथन का ज़ेन। मॉड्यूल से पहले डॉट सापेक्ष / nonrelative लिंकिंग को स्पष्ट बनाता है जिससे संभावित नाम टकरावों को हल किया जा सकता है। हालांकि 'पठनीयता मायने रखती है।' थोड़ा पीड़ित है।
पफन्यूसी

2
नहीं, वास्तव में यह "विपरीत" था, "व्यावहारिकता शुद्धता को हराती है" निर्णय। "आयात *" के बिना, कार्य के अंदर स्थानीय चर पहुंच को अनुकूलित करने के लिए यह आवश्यक था, संकलक हमेशा कोड का विश्लेषण करके जानता है कि चर क्या स्थानीय हैं और सीधे देखे जा सकते हैं। वास्तव में, फ़ंक्शंस स्थानीय भंडारण के लिए एक तानाशाह का उपयोग भी नहीं करते हैं, लेकिन एक अनुकूलित सरणी जहां चर अद्वितीय सूचकांक प्राप्त करते हैं।
वेकी

11

पायथन 2 और पायथन 3 दोनों का समर्थन करने के लिए, नीचे दिए गए स्पष्ट सापेक्ष आयात का उपयोग करें। वे वर्तमान मॉड्यूल के सापेक्ष हैं। उन्हें 2.5 से शुरू करने का समर्थन किया गया है ।

from .sister import foo
from . import brother
from ..aunt import bar
from .. import uncle

14
import .brother मुझे Python 3.5 में एक अमान्य सिंटैक्स त्रुटि देता है। यह सामान्य बात है? मेरे पास init .py है। निर्देशिका में यह है
फ्रास्टर

1
import .brotherअजगर 2 और 3
रॉड्रिगो ई। प्रिंसिपल

@ RodrigoE.Principe और ऐसा लगता है import ..uncle। फिक्स्ड। ओह, मैं क्या सोच रहा था ... शायद शूरवीरों से विचलित हो गया जो नी कहते हैं!
अक्सेली पालेन

4

एक और मामला मिशेल गॉर्नी के जवाब में जोड़ा गया:

ध्यान दें कि सापेक्ष आयात वर्तमान मॉड्यूल के नाम पर आधारित हैं। चूंकि मुख्य मॉड्यूल का नाम हमेशा " __main__" होता है, इसलिए पायथन एप्लिकेशन के मुख्य मॉड्यूल के रूप में उपयोग के लिए बनाए गए मॉड्यूल को हमेशा पूर्ण आयात का उपयोग करना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.