Подтвердить что ты не робот

Импорт модуля Python: однострочный и многострочный

Итак, это простой вопрос. В python при импорте модулей в чем разница между ними:

from module import a, b, c, d

и этот

from module import a
from module import b
from module import c
from module import d

Для меня имеет смысл всегда конденсировать код и использовать первый пример, но я видел некоторые образцы кода, там второй второй. Есть ли какая-либо разница вообще или все это в предпочтении программиста?

4b9b3361

Ответ 1

Нет никакой разницы. Оба они функционируют точно так же.

Однако, с точки зрения стилистики, это может быть более предпочтительным, чем другое. И на этой ноте PEP-8 для импорта говорится, что вы должны сжать from module import name1, name2 на одну строку и оставить import module1 на нескольких строках:

Yes: import os
     import sys

No:  import sys, os

Ok: from subprocess import Popen, PIPE

В ответ на комментарий @teewuane (повторяется здесь, если комментарий удаляется):

@inspectorG4dget Что делать, если вам нужно импортировать несколько функций из одного модуль, и он заканчивает тем, что линия длиннее 80 char? я знаю что 80 char вещь - "когда это делает код более читаемым", но я мне все еще интересно, есть ли более аккуратный способ сделать это. И я не хочу сделать из импорта foo *, хотя я в основном импортирую все.

Проблема здесь в том, что выполнение чего-то вроде следующего может превысить предел 80 char:

from module import func1, func2, func3, func4, func5

Для этого у меня есть два ответа (я не вижу, чтобы PEP8 был слишком ясен об этом):

Разбить его на два импорта:

from module import func1, func2, func3
from module import func4, func5

Выполнение этого имеет тот недостаток, что если module удаляется из базы кода или иным образом реорганизуется, необходимо удалить обе строки импорта. Это может оказаться болезненным.

Разделить строку:

Чтобы смягчить вышеупомянутую проблему, может быть разумнее сделать

from module import func1, func2, func3, \
     func4, func5

Это приведет к ошибке, если вторая строка не будет удалена вместе с первой, сохраняя при этом единственную операцию импорта

Ответ 2

Чтобы добавить к некоторым вопросам, поднятым из answer.Google answer, вы также можете использовать кортежи для многострочного импорта, когда структуры папок начинают глубоко вставляться или у вас есть модули с тупыми именами.

from some.module.submodule.that_has_long_names import (
    first_item,
    second_item,
    more_imported_items_with_really_enormously_long_names_that_might_be_too_descriptive,
    that_would_certainly_not_fit,
    on_one_line,
)

Это тоже работает, хотя я не поклонник этого стиля:

from module import (a_ton, of, modules, that_seem, to_keep, needing,
                    to_be, added, to_the_list, of_required_items)

Ответ 3

Я бы предложил не следовать PEP-8 вслепую. Когда вы импортируете около половины экрана, вещи начинают становиться неудобными, и PEP-8 вступает в конфликт с рекомендациями по удобочитаемости PEP-20.

Я предпочитаю,

  1. Поместите все встроенные операции импорта в одну строку, такие как sys, os, time и т.д.
  2. Для других импортов используйте одну строку на пакет (не модуль)

Выше дает вам хороший баланс, потому что читатель все еще может быстро просмотреть зависимости при достижении разумной компактности.

Например,

Мои предпочтения

# one line per package

import os, json, time, sys, math
import numpy as np
import torch, torch.nn as nn, torch.autograd, torch.nn.functional as F
from torchvision models, transforms

PEP-8 Рекомендация

# one line per module or from ... import statement

import os
import json
import time
import sys
import math

import numpy as np

import torch
from torch import nn as nn, autograd, nn.functional as F
from torchvision import models, transforms