Çok satırlı içe aktarmalar için önerilen bir format var mı?


114

Python'da çok satırlı içe aktarımları kodlamanın üç yolu olduğunu okudum

Eğik çizgilerle:

from Tkinter import Tk, Frame, Button, Entry, Canvas, Text, \
    LEFT, DISABLED, NORMAL, RIDGE, END

Yinelenen cümle:

from Tkinter import Tk, Frame, Button, Entry, Canvas, Text
from Tkinter import LEFT, DISABLED, NORMAL, RIDGE, END

Parantez ile:

from Tkinter import (Tk, Frame, Button, Entry, Canvas, Text,
    LEFT, DISABLED, NORMAL, RIDGE, END)

Bu ifadeler için önerilen bir format veya daha zarif bir yol var mı?


3
bu kadar çok ithalatla, neden sadece olmasın from Tkinter import *?
Inbar Rose

2
Bu bir örnektir. Gerçek ifade şu, from data.forms import AddressEmbeddedField, PhoneEmbeddedField, MailEmbeddedField, \ WebEmbeddedFieldancak data.forms içindeki tüm gömülü alanları içe aktarmak istemiyorum
Manuel Alvarez

19
Birçok sebep. Örneğin, bilmediğiniz birçok değişkenin üzerine yazabilirsiniz. Tarafından ithal edilen tüm isimleri biliyor musunuz from Tkinter import *? Değilim. Ve IDE'ler bu adların (belki) olup olmadığını bilemezler, bu nedenle geçersiz bir ad girip girmediğinizi anlayamazlar.
Thorsten Kranz

2
@InbarRose Kötü bir alışkanlık, stackoverflow.com/questions/3615125/… 'e bakın
Yuval Pruss

Yanıtlar:


161

Kişisel olarak, birden fazla bileşeni içe aktarırken parantez kullanıyorum ve bunları alfabetik olarak sıralıyorum. Şöyle:

from Tkinter import (
    Button,
    Canvas,
    DISABLED,
    END,
    Entry,
    Frame,
    LEFT,
    NORMAL,
    RIDGE,
    Text,
    Tk,
)

Bu, her bir işlemde veya PR'da hangi bileşenlerin eklendiğini / kaldırıldığını kolayca görme avantajına sahiptir.

Genel olarak bu kişisel bir tercihtir ve size en iyi görünen şeyle gitmenizi tavsiye ederim.


3
Bence önemli olan tutarlı olmaktır (en azından belirli bir proje içinde). Bu, kodu okuyan birinin çok fazla zorluk çekmeden neyin içe aktarıldığını bulmasını kolaylaştıracaktır.
Blckknght

1
isort, çok satırlı içe aktarmayı
Motin

16

Örnekleriniz PEP 328'den kaynaklanıyor gibi görünüyor . Orada, tam olarak bu problem için parantez-gösterim önerilmiştir, bu yüzden muhtemelen bunu seçerim.


4

PEP328'deki parantez gösterimi ile parantezlerden önce ve sonra yeni satırlar eklenmiş olarak giderdim :

from Tkinter import (
    Tk, Frame, Button, Entry, Canvas, Text, 
    LEFT, DISABLED, NORMAL, RIDGE, END
)

Bu, Django'nun kullandığı formattır :

from django.test.client import Client, RequestFactory
from django.test.testcases import (
    LiveServerTestCase, SimpleTestCase, TestCase, TransactionTestCase,
    skipIfDBFeature, skipUnlessAnyDBFeature, skipUnlessDBFeature,
)
from django.test.utils import (
    ignore_warnings, modify_settings, override_settings,
    override_system_checks, tag,
)

PEP 328'de parantezden sonra / sonra yeni satır eklenmemiş mi?
Gandalf Saxe

@GandalfSaxe PEP 328, biçimlendirmeyle ilgili değil, anlambilim (dile yeni bir özellik eklemek) hakkındaydı.
Max Malysh

O zaman tam olarak anlamıyorum. PEP 328'den çok hatlı ithalat için parantez içerdiğini söylüyorsunuz, ancak hiçbiri yok mu? "PEP328'deki parantez gösterimi ile parantezlerin önüne ve arkasına yeni satırlar eklenmiş olarak gidecektim:"
Gandalf Saxe

PEP 328 dile parantez notasyonu ekledi. Parantez notasyonu aşağıdaki gibi birden çok modülleri almak için yeteneğidir: from foo import (bar, baz). PEP 328, biçimlendirme hakkında hiçbir şey söylemiyor.
Max Malysh

Ah tamam, şimdi ne demek istediğini anlıyorum :)
Gandalf Saxe

-4

Genellikle Tkinter ile, from Tkinter import *modül yalnızca açıkça pencere öğesi olan isimleri dışa aktaracağı için kullanmakta bir sakınca yoktur .

PEP 8 , böyle bir durum için herhangi bir konvansiyon listelemiyor, bu yüzden en iyi seçeneğin ne olduğuna karar vermek size kalmış. Her şey okunabilirlikle ilgili, bu yüzden tek bir modülden bir şeyler içe aktardığınızı açıkça gösteren neyse onu seçin.

Tüm bu isimler kapsamınızda mevcut olduğundan, ben şahsen 2. seçeneğin en açık olduğunu düşünüyorum, çünkü içe aktarılan isimleri en iyi görebiliyorsunuz. Daha sonra, belki birbirine ait olan isimleri bir araya getirmek için daha fazla bölebilirsiniz. Örnekte ben koymak olabilir Tk, Frameve Canvasyerken kişilermişiz grup birlikte widget'lardan olarak ayrı ayrı Buttonve Textayrı bir görünümde küçük bileşenleridir olarak.


11
X içe
Tolo Palmer

1
@ToloPalmer Bu genellikle doğrudur, ancak Tkinter için bu genellikle uygundur, çünkü yalnızca widget'ları içe aktarırsınız; hatta kütüphane referansında bu şekilde listelenmiştir . İçe aktarmayı ilk sırada listelerseniz, herhangi bir çatışmaya karşı özellikle güvende olmanız gerekir.
sokmak

1
Referans olarak, düzgün from X import *kullanılan paketler için bile sorun, __all__gibi statik kod çözümleyicilerinin pyflakestanımsız isimleri saptayamamasıdır, import *çünkü tanımsız adların *.
RubenLaguna
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.