Существует ли рекомендованный формат для многолинейного импорта?

Я прочитал, что существует три способа кодирования многострочного импорта в python

С помощью слэшей:

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

Дублирующие отправители:

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

С круглыми скобками:

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

Есть ли рекомендованный формат или более элегантный способ для этих утверждений?

Ответ 1

Лично я иду в круглые скобки при импорте нескольких компонентов и сортирую их по алфавиту. Например:

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

Это имеет дополнительное преимущество, заключающееся в том, чтобы легко увидеть, какие компоненты были добавлены/удалены в каждой транзакции или PR.

В целом, хотя это личное предпочтение, и я бы посоветовал вам пойти с тем, что выглядит лучше всего для вас.

Ответ 2

Ваши примеры, похоже, вытекают из PEP 328. Там для обозначения этой проблемы предлагается скобка-нотация, поэтому, вероятно, я бы выбрал эту.

Ответ 3

Я бы пошел с записью скобок из PEP328 с новыми символами, добавленными до и после круглых скобок:

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

Это формат, который Django использует:

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,
)

Ответ 4

Обычно с Tkinter можно просто использовать from Tkinter import *, поскольку модуль будет только экспортировать имена, которые явно видны.

PEP 8 не содержит никаких условностей для такого случая, поэтому я думаю, вам решать, какой вариант лучше всего. Это все о читаемости, поэтому выберите то, что позволяет понять, что вы импортируете материал из одного модуля.

Поскольку все эти имена доступны в вашей области видимости, я лично считаю, что параметры 2 наиболее ясны, так как вы можете увидеть импортированные имена лучше всех. Вы могли бы даже разделить его больше, чтобы, возможно, объединить эти имена вместе, которые принадлежат друг другу. В вашем примере я мог бы добавлять Tk, Frame и Canvas отдельно, поскольку они группируют виджеты вместе, имея при этом Button и Text отдельно, поскольку они представляют собой меньшие компоненты в представлении.