Python `import x` ve` x x import y` ifadelerinden sıralamanın doğru yolu nedir?


170

Piton stil kılavuzu böyle grup ithalatı için öneriyor:

İthalat aşağıdaki sırayla gruplandırılmalıdır:

  1. standart kütüphane ithalatı
  2. ilgili üçüncü taraf ithalatı
  3. yerel uygulamaya / kütüphaneye özel ithalat

Bununla birlikte, iki farklı ithalat yolunun nasıl ortaya konması gerektiği hakkında bir şey söylemez:

from foo import bar
import foo

Bunları sıralamanın birden çok yolu vardır (tüm bu içe aktarma işlemlerinin aynı gruba ait olduğunu varsayalım):

  • önce from..import, sonraimport

    from g import gg
    from x import xx
    import abc
    import def
    import x
  • önce import, sonrafrom..import

    import abc
    import def
    import x
    from g import gg
    from x import xx
  • modül adına göre alfabetik sıralama, içe aktarma türünü yok sayarak

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

PEP8 bunun için tercih edilen sıradan bahsetmez ve "temizleme ithalatı" özellikleri bazı IDE'lerin muhtemelen bu özelliğin geliştiricisinin tercih ettiği her şeyi yapar.

Bu veya BDFL (veya başka bir Python çekirdek geliştirici) ilgili bir yorum / e-posta açıklayan başka bir PEP arıyorum . Lütfen kendi tercihinizi belirten öznel cevaplar göndermeyin.


20
Bunu kapatmak için oy veren kullanıcıya: Fikir istemiyorum ! Lütfen sorumun son paragrafını okuyun.
ThiefMaster

9
"Doğru" bir yol olduğundan şüpheliyim. Bu konuda kendi tarzınızı seçmenin nesi yanlış? Kimse bilmiyorsa, bir konvansiyon olamaz. Ve gerçekten önemli mi? Bunu belirtmenin avantajı nedir?
Steven Rumbalski

6
PEP8 gibi +1 sesler genişletilmelidir.
hochl

7
Bir PEP'deki zayıflık mutlaka değiştirilmesi gerektiği anlamına gelmez.
Ignacio Vazquez-Abrams

2
Genellikle tarafından mantıksal gruplar halinde ithalat ve sonra sıralama bu küçük gruplar bölmek hat uzunluğu o basit bir nedenle ... bak güzel. Bu mantıksal grupları bir şekilde mantıklı bir sıraya koyarsanız, herhangi bir içe Ctrl+F
aktarmayı

Yanıtlar:


112

İthalat genellikle alfabetik olarak sıralanır ve PEP 8'in yanında çeşitli yerlerde tanımlanır.

Alfabetik sıralı modüller daha hızlı okunur ve aranabilir . Sonuçta python tamamen okunabilirlikle ilgilidir. Ayrıca, bir şeyin içe aktarıldığını doğrulamak daha kolaydır ve yinelenen içe aktarmaları önler

PEP 8'de sıralama ile ilgili hiçbir şey yoktur.

Saygın sitelerden ve depolardan da birkaç referansa göre popülerlik, Alfabetik sıralama yoludur.

örneğin böyle:

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

VEYA

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 resmi deposu ayrıca, genel olarak PEP-8 ithalat siparişinin kullanılması gerektiğini belirtir. Ancak birkaç ekleme var

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

Referanslar:

Not: isort yardımcı programı içe aktarmalarınızı otomatik olarak sıralar.


21
Asıl soruyu nerede cevapladığınızı görmüyorum…
liori

3
@liori Modüllerin nasıl sıralanacağını belirten bir referans / ilgili bağlantılar gönderdim. PEP 8 hiçbir şeyden bahsetmediğinden, başka birçok referansta bunun gibi içe aktarma yöntemlerinin kullanılması önerilmektedir.
Abhishek

7
Sorunun sıralama import xve from y import zbirbirlerine göre ifadeler ile ilgili olduğunu unutmayın . Cevabınızda bu soruya cevap göremiyorum. Temel olarak PEP8'in içe aktarma türüne göre gruplama yolunu açıklayan sorunun bir kısmını yeniden yazıyorsunuz. Bu özel soruya cevap bazı bağlantılarda bulunuyorsa, lütfen ilgili bölümleri belirtin.
liori

2
Alfabetik sıralı içe aktarma ifadelerinin okunmasının daha kolay olduğu iddiası üzerine muhalif bir görünüm not etmek istiyorum. Uzunluğa göre sıralanmış ithalat ifadelerine kıyasla bunları okumak çok daha zor. Belirli bir uzunluk grubu içinde sözcüksel olarak sıraladıysanız, bu iyi olur ve hatta yararlı olabilir. Ama bulmak istiyorum import datetimeizledi import os çok zor daha okumayı import osizledi import datetime. Ve sözcüksel sıralama değil, sözcüksel olarak sıralanmamış olarak verilen onları aramadaki fark, hafif bir şekilde bile tamamen önemli olmayacak kadar önemsizdir.
ely

Özel ve kamu ithalatı için hangi sipariş kullanılmalıdır? ( import _tkintervs import unittest)
Stevoisiak

30

CIA'nın dahili kodlama kurallarına ( WikiLeaks Kasası 7 sızıntısının bir parçası ) göre, python ithalatı üç gruba ayrılmalıdır:

  1. Standart kütüphane ithalatı
  2. Üçüncü taraf ithalatı
  3. Uygulamaya özel ithalat

İthalat, vakaları göz ardı ederek bu gruplar içinde sözlükbilimsel olarak sipariş edilmelidir:

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

23
Kahkaha faktörünün CIA'nın kodlama stili yönergeleri olduğu öne sürüldü. Çok zeki, ama aynı zamanda ilgili geliştiriciler gelen uzmanlık seviyesi göz önüne alındığında.
Tyler James Harden



1
Ancak, from x import yönce veya sonra olması gerekiyorsa örnekten gelmez from y import x- modülün adı mı yoksa siparişi belirleyen gerçek ithalat mı?
Niklas R.

1
Bunun bir şaka olduğunu biliyorum, ama uygun bir inek olarak bunun aslında PEP8'den geldiğini belirtmek istiyorum
Marat

8

PEP 8 bu konuda hiçbir şey söylemiyor. Bu nokta için bir sözleşme yoktur ve bu Python topluluğunun kesinlikle bir tanesini tanımlaması gerektiği anlamına gelmez. Bir seçim bir proje için daha iyi olabilir ama bir diğeri için en kötüsü olabilir ... Bu, her çözümün profesyonel ve eksileri olduğu için bunun bir tercih meselesidir. Ancak sözleşmeleri takip etmek istiyorsanız, alıntıladığınız asıl düzene saygı göstermelisiniz:

  1. standart kütüphane ithalatı
  2. ilgili üçüncü taraf ithalatı
  3. yerel uygulamaya / kütüphaneye özel ithalat

Örneğin, Google bu sayfasında önermek olduğunu ithalat leksikografik sıralanması gerektiğini her kategoriden (standart / üçüncü kişilerin / sizinki) içinde. Ama Facebook, Yahoo ve her neyse, belki başka bir kongre ...



0

Tüm import xifadeler değerine göre sıralanmalı xve tüm from x import yifadeler xalfabetik sırayla değerine göre sıralanmalı ve sıralı ifade grupları from x import ysıralı ifade grubunu izlemelidir import x.

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

0

Kabul edilen cevabın biraz fazla ayrıntılı olduğunu hissediyorum. İşte TLDR:

Her gruplandırmada, ithalatlar, her modülün tam paket yoluna göre, söz konusu durumu göz ardı ederek sözlükbilimsel olarak sıralanmalıdır.

Google kod stili kılavuzu

Üçüncü seçenek doğrudur:

import abc
import def
from g import yy  # changed gg->yy for illustrative purposes
import x
from xx import xx
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.