2013-02-21 4 views
26

Так что это простой вопрос. В 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 

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

+1

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

ответ

49

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

Однако, с точки зрения стилизации, предпочтительнее, чем другое. И на этой ноте, PEP-8 for imports говорит, что вы должны сжать 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 символов? Я знаю , что 80-значный символ «когда он делает код более читаемым», но я все еще задаюсь вопросом, есть ли более аккуратный способ сделать это. И я не хочу сделать из импорта foo *, хотя я в основном импортирую все.

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

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

к этому, у меня есть два ответа (я не вижу PEP8 чрезмерно ясно об этом) :

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

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

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

Split линия:

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

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

Это приведет к ошибке, если вторая линия не удаляется вместе с первым, сохраняя при этом сингулярное заявление о ввозе

+0

Я вроде как думал, что это так. Все в глазах программиста. Я никогда не знал о проблемах с одним модулем, но я использую это везде, и вам нужно будет внести некоторые изменения. Благодаря! –

+4

@CodyBrown: 'single line issues' <- они на самом деле не проблемы; больше похоже на руководства по стилям. У них нет никакого мандата, чтобы следовать им. Возможно, вы работаете в команде, которая использует совершенно иное руководство по стилю, и в этом случае PEP-8 становится полностью неприменимым. – inspectorG4dget

+1

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

15

Чтобы добавить к некоторым вопросам, поставленным с inspectorG4dget's 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) 
+0

Лично я считаю, что это мой личный любимый стиль. Он не требует выхода из строя или избыточности – codeblooded

Смежные вопросы