पायथन `आयात x` और` एक्स आयात y` बयानों से सॉर्ट करने का सही तरीका क्या है?


170

अजगर गाइड शैली इस तरह समूह का आयात करने के लिए पता चलता है:

निम्न क्रम में आयात किया जाना चाहिए:

  1. मानक पुस्तकालय आयात
  2. संबंधित तृतीय पक्ष आयात
  3. स्थानीय अनुप्रयोग / पुस्तकालय विशिष्ट आयात

हालांकि, इसमें कुछ भी उल्लेख नहीं है कि आयात के दो अलग-अलग तरीकों को कैसे निर्धारित किया जाना चाहिए:

from foo import bar
import foo

उन्हें सॉर्ट करने के कई तरीके हैं (मान लें कि सभी आयात एक ही समूह के हैं):

  • पहले from..import, फिरimport

    from g import gg
    from x import xx
    import abc
    import def
    import x
  • पहले import, फिरfrom..import

    import abc
    import def
    import x
    from g import gg
    from x import xx
  • आयात के प्रकार को अनदेखा करते हुए मॉड्यूल नाम से वर्णानुक्रम

    import abc
    import def
    from g import gg
    import x
    from xx import xx

PEP8 ने इसके लिए पसंदीदा ऑर्डर का उल्लेख नहीं किया है और "क्लीनअप इम्पोर्ट" सुविधाओं में कुछ IDE हैं जो संभवतया उस सुविधा के डेवलपर को पसंद करते हैं।

मैं एक और PEP यह या एक प्रासंगिक टिप्पणी / BDFL (या एक और पायथन कोर डेवलपर) से ईमेल स्पष्ट करने के लिए देख रहा हूँकृपया अपनी स्वयं की पसंद बताते हुए व्यक्तिपरक उत्तर न दें।


20
इसे बंद करने के लिए मतदान करने वाले उपयोगकर्ता के लिए: मैं राय नहीं माँग रहा हूँ ! कृपया मेरे प्रश्न के अंतिम पैराग्राफ को पढ़ें।
ThiefMaster

9
मुझे संदेह है कि एक "सही" तरीका है। इस पर अपनी खुद की शैली चुनने में क्या गलत है? अगर कोई नहीं जानता तो शायद ही कोई सम्मेलन हो सकता है। और क्या यह वास्तव में मायने रखता है? यह निर्दिष्ट होने का क्या फायदा है?
स्टीवन रंबलस्की

6
PEP8 जैसी +1 ध्वनियों को बढ़ाया जाना चाहिए।
होचेल

7
पीईपी में कमजोरी का मतलब यह नहीं है कि इसमें संशोधन की जरूरत है।
इग्नासियो वाज़केज़-अब्राम्स

2
मैं आमतौर पर आयात को तार्किक समूहों में विभाजित करता हूं और फिर इन छोटे समूहों को लाइन की लंबाई के आधार पर सॉर्ट करता हूं ... साधारण कारण से वे अच्छे लगते हैं । यदि आप इन तार्किक समूहों को किसी भी तरह से तार्किक क्रम में रखते हैं तो आप किसी भी आयात को बहुत तेजी से खोज सकते हैं (इसके अलावा Ctrl+Fलगातार समय कोई फर्क नहीं पड़ता कि आप आयात कैसे व्यवस्थित करते हैं ...)
बकरीउ

जवाबों:


112

आयात आम तौर पर वर्णानुक्रम में क्रमबद्ध होते हैं और पीईपी 8 के बगल में विभिन्न स्थानों में वर्णित हैं।

वर्णानुक्रम में सॉर्ट किए गए मॉड्यूल पढ़ने और खोज करने में तेज होते हैं । अजगर के बाद सब पठनीयता के बारे में है। इसके अलावा यह सत्यापित करना आसान है कि कुछ आयात किया गया है, और डुप्लिकेट आयात से बचा जाता है

PEP 8 में छंटाई के बारे में कुछ भी उपलब्ध नहीं है। इसके अलावा आप जो भी उपयोग करते हैं उसके बारे में।

सम्मानित साइटों और रिपॉजिटरी से भी कुछ संदर्भों के अनुसार लोकप्रियता, वर्णमाला क्रम का तरीका है।

इस तरह के लिए:

import httplib
import logging
import random
import StringIO
import time
import unittest
from nova.api import openstack
from nova.auth import users
from nova.endpoint import cloud

या

import a_standard
import b_standard

import a_third_party
import b_third_party

from a_soc import f
from a_soc import g
from b_soc import d

Reddit आधिकारिक रिपॉजिटरी में यह भी कहा गया है कि, सामान्य PEP-8 में आयात आदेश का उपयोग किया जाना चाहिए। हालाँकि इसमें कुछ जोड़ हैं

for each imported group the order of imports should be:
import <package>.<module> style lines in alphabetical order
from <package>.<module> import <symbol> style in alphabetical order

संदर्भ:

पुनश्च: isort उपयोगिता स्वचालित रूप से आपके आयात को सॉर्ट करती है।


21
मैं नहीं देखता कि आप वास्तविक प्रश्न का उत्तर कहाँ दे रहे हैं ...
liori

3
@liori मैंने एक संदर्भ / प्रासंगिक लिंक प्रस्तुत किया जिसमें बताया गया था कि कैसे मॉड्यूल को सॉर्ट करना है। PEP 8 के रूप में कुछ भी उल्लेख नहीं है, लेकिन कई अन्य संदर्भ इस तरह आयात विधियों का उपयोग करने का सुझाव देते हैं।
अभिषेक

7
ध्यान दें कि प्रश्न एक दूसरे के सापेक्ष छँटाई import xऔर from y import zकथन के बारे में है । मुझे आपके जवाब में इस सवाल का कोई जवाब नहीं दिख रहा है। आप मूल रूप से उस प्रश्न का हिस्सा बहाल कर रहे हैं जो पहले से ही आयात प्रकार से समूहीकरण के PEP8 तरीके की व्याख्या करता है। यदि इस विशिष्ट प्रश्न का उत्तर कुछ लिंक में है, तो कृपया संबंधित भागों को उद्धृत करें।
लियोरी

2
मैं इस दावे पर एक असंतोषजनक दृष्टिकोण रखना चाहूंगा कि वर्णानुक्रम में छाँटे गए आयात विवरणों को पढ़ना आसान है। मुझे लंबाई के आधार पर आयात किए गए बयानों की तुलना में उन्हें पढ़ना बहुत कठिन लगता है। यदि आप किसी दिए गए लंबाई समूह के भीतर शाब्दिक रूप से हल करते हैं, तो यह ठीक होगा और फायदेमंद भी हो सकता है। लेकिन, मुझे मिलेगा import datetime, जिसके बाद import os बहुत कठिन से पढ़ने के लिए import osके बाद import datetime। और उन्हें दिए गए लेक्सिकल सॉर्टिंग बनाम लेक्सिकली सॉर्ट नहीं किए जाने की खोज में अंतर इतना मामूली है कि पूरी तरह से किसी भी तरह से भी कोई फर्क नहीं पड़ता।
एली

निजी बनाम सार्वजनिक आयात के लिए किस आदेश का उपयोग किया जाना चाहिए? ( import _tkinterवि। import unittest)
स्टेविसीक २५'१

30

CIA के आंतरिक कोडिंग कन्वेंशन ( विकीलीक्स वॉल्ट 7 लीक का हिस्सा ) के अनुसार, अजगर आयात को तीन समूहों में बांटा जाना चाहिए:

  1. मानक पुस्तकालय आयात
  2. तृतीय-पक्ष आयात
  3. अनुप्रयोग-विशिष्ट आयात

इन समूहों के भीतर मामले को अनदेखा करते हुए आयात का आदेश दिया जाना चाहिए:

import foo
from foo import bar
from foo.bar import baz
from foo.bar import Quux
from Foob import ar

23
हंसी कारक के लिए Upvoted कि यह CIA की कोडिंग शैली दिशानिर्देश है। बहुत चतुर, लेकिन एक ही समय में प्रासंगिक उन डेवलपर्स से आने वाले विशेषज्ञता के स्तर को देखते हुए।
टायलर जेम्स हार्डन



1
लेकिन यह उदाहरण से पालन नहीं करता है यदि from x import yपहले या बाद में होना चाहिए from y import x- क्या यह मॉड्यूल का नाम है या वास्तविक आयात जो आदेश निर्धारित करता है?
आर।

1
मुझे पता है कि यह एक मजाक है, लेकिन एक उचित बेवकूफ के रूप में मैं यह बताना चाहता हूं कि यह वास्तव में PEP8 से आ रहा है
Marat

8

पीईपी 8 वास्तव में इसके बारे में कुछ नहीं कहता है। इस बिंदु के लिए कोई सम्मेलन नहीं है, और इसका मतलब यह नहीं है कि पायथन समुदाय को एक बिल्कुल परिभाषित करने की आवश्यकता है। एक विकल्प एक परियोजना के लिए बेहतर हो सकता है लेकिन दूसरे के लिए सबसे खराब ... यह इसके लिए वरीयताओं का सवाल है, क्योंकि प्रत्येक समाधान में समर्थक और विपक्ष हैं। लेकिन यदि आप सम्मेलनों का पालन करना चाहते हैं, तो आपको अपने द्वारा उद्धृत मूल आदेश का सम्मान करना होगा:

  1. मानक पुस्तकालय आयात
  2. संबंधित तृतीय पक्ष आयात
  3. स्थानीय अनुप्रयोग / पुस्तकालय विशिष्ट आयात

उदाहरण के लिए, Google इस पृष्ठ में अनुशंसा करता है कि आयात को प्रत्येक श्रेणी (मानक / तीसरे पक्ष / तुम्हारा) में शाब्दिक रूप से क्रमबद्ध किया जाना चाहिए । लेकिन फेसबुक, याहू और जो भी हो, यह शायद एक और सम्मेलन है ...



0

सभी import xकथनों को मान के आधार पर क्रमबद्ध किया जाना चाहिए xऔर सभी from x import yकथनों को xवर्णमाला क्रम के मान से क्रमबद्ध किया जाना चाहिए और कथनों के क्रमबद्ध समूहों को from x import yकथनों के क्रमबद्ध समूह का पालन करना चाहिए import x

import abc
import def
import x
from g import gg
from x import xx
from z import a

0

मुझे ऐसा लगता है कि स्वीकृत उत्तर थोड़ा सा क्रियात्मक है। यहाँ TLDR है:

प्रत्येक समूह के भीतर, आयात को प्रत्येक मॉड्यूल के पूर्ण पैकेज पथ के अनुसार, मामले की अनदेखी करते हुए, शाब्दिक रूप से क्रमबद्ध किया जाना चाहिए

गूगल कोड शैली गाइड

तो, तीसरा विकल्प सही है:

import abc
import def
from g import yy  # changed gg->yy for illustrative purposes
import x
from xx import xx
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.