Импорт модулей в Python – лучшая практика

Я новичок в Python, так как хочу расширить навыки, которые я изучил с помощью R. В RI, как правило, загружается множество библиотек, иногда приводя к конфликтам имен функций.

Что является лучшей практикой в ​​Python. Я видел некоторые конкретные варианты, в которых я не вижу разницы между

import pandas , from pandas import * , а также from pandas import DataFrame

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

ОБНОВИТЬ

Я нашел этот отличный путеводитель . Это объясняет все.

  • Получить дату и время установки для пакетов, установленных через pip
  • Ошибка MySQL: 2013, «Потерянное соединение с сервером MySQL при чтении исходного пакета связи», системная ошибка: 0 "
  • Как реализовать взвешенную двоичную кросс-энтропию на анано?
  • Как получить доступ к полю геометрии (точки) в базе данных PostGIS из Django?
  • Как создать PDF-документ с разными размерами страниц в reportlab, python
  • Как заставить большие шаги выполнять функции scipy.optimize?
  • Напишите изображение в буфер обмена Windows в python с PIL и win32clipboard?
  • Как создать динамический массив
  • 6 Solutions collect form web for “Импорт модулей в Python – лучшая практика”

    import pandas импортирует модуль pandas под пространством имен pandas, поэтому вам нужно будет вызвать объекты в pandas с помощью pandas.foo .

    from pandas import * импортирует все объекты из модуля pandas в ваше текущее пространство имен, поэтому вы вызываете объекты в pandas, используя только foo . Имейте в виду, что это может иметь необъяснимые последствия, если между вашим текущим пространством имен и пространством имен pandas существуют конфликты с именами.

    from pandas import DataFrame является таким же, как указано выше, но только импортирует DataFrame (а не все) в ваше текущее пространство имен.

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

    В общем, лучше делать явный импорт. Как в:

     import pandas frame = pandas.DataFrame() 

    Или:

     from pandas import DataFrame frame = DataFrame() 

    Другой вариант в Python, когда у вас конфликтующие имена, является import x as y:

     from pandas import DataFrame as PDataFrame from bears import DataFrame as BDataFrame frame1 = PDataFrame() frame2 = BDataFrame() 
     from A import B 

    по существу, равен трем утверждениям

     import A B = AB del A 

    Вот и все, вот и все.

    Недостаток каждой формы

    При чтении кода других людей (и эти люди используют очень разные стили импорта), я заметил следующие проблемы с каждым из стилей:

    import modulewithaverylongname будет загромождать код далее вниз с длинным именем модуля (например, concurrent.futures или django.contrib.auth.backends ) и уменьшать читаемость в этих местах.

    from module import * дает возможности синтаксически видеть, что, например, classA и classB происходят из одного модуля и имеют много общего друг с другом. Это делает чтение кода жестким . (То, что имена из такого импорта могут быть теневыми именами из более раннего импорта, является наименьшей частью этой проблемы.)

    from module import classA, classB, functionC, constantD, functionE перегружает мою кратковременную память со слишком большим количеством имен, которые я мысленно должен назначить module , чтобы координировать код.

    import modulewithaverylongname as mwvln иногда недостаточно мнемоничен для меня .

    Подходящий компромисс

    Основываясь на приведенных выше замечаниях, я разработал следующий стиль в своем собственном коде:

    import module – предпочтительный стиль, если имя модуля коротки, например, большинство пакетов в стандартной библиотеке. Это также предпочтительный стиль, если мне нужно использовать имена из модуля только в двух или трех местах в моем собственном модуле; кратность ясности (тогда как «читаемость учитывается» ).

    import longername as ln является предпочтительным стилем почти в каждом другом случае. Например, я могу import django.contrib.auth.backends as dj_abe . По определению вышеприведенного критерия 1 аббревиатура будет использоваться часто и, следовательно, достаточно легко запомнить.

    Только эти два стиля полностью pythonic в соответствии с «Явный лучше, чем неявный». править.

    from module import xx прежнему иногда встречается в моем коде. Я использую его в тех случаях, когда формат формата выглядит преувеличенным, самым известным примером является from datetime import datetime .

    Вот некоторые рекомендации из Руководства по стилю PEP8.

    1. Импорт обычно должен быть в отдельных строках , например:

       Yes: import os import sys No: import sys, os 

      но это нормально

       from subprocess import Popen, PIPE 
    2. Импорт всегда помещается в верхнюю часть файла, сразу после комментариев модуля и доклингов, а также перед глобалами и константами модуля.

      • Импорт должен быть сгруппирован в следующем порядке:
        1. импорт стандартной библиотеки
        2. импорт третьей стороны
        3. импорт локальных приложений / библиотек
      • Вы должны поместить пустую строку между каждой группой импорта.
    3. Рекомендуется абсолютный импорт
      Они более читабельны и облегчают отладку, предоставляя улучшенные сообщения об ошибках, если вы испортите систему импорта.

       import mypkg.sibling from mypkg import sibling from mypkg.sibling import example 

      или явный относительный импорт

       from . import sibling from .sibling import example 
    4. Имплицитный относительный импорт никогда не должен использоваться и удаляется в Python 3.

       No: from ..grand_parent_package import uncle_package 
    5. Следует избегать импорта подстановочных знаков ( from <module> import * ) , поскольку они неясны, какие имена присутствуют в пространстве имен, запутывая как читателей, так и множество автоматизированных инструментов.


    Некоторые рекомендации о lazy imports из подсказок производительности скорости питона.

    Накладные расходы на импорт

    Операторы импорта могут выполняться практически везде. Часто бывает полезно разместить их внутри функций, чтобы ограничить их видимость и / или уменьшить начальное время запуска. Хотя интерпретатор Python оптимизирован, чтобы не импортировать один и тот же модуль несколько раз, повторное выполнение оператора импорта может серьезно повлиять на производительность в некоторых случаях.

    ниже приведен сценарий, описанный на странице,

     >>> def doit1(): ... import string ... string.lower('Python') ... >>> import string >>> def doit2(): ... string.lower('Python') ... >>> import timeit >>> t = timeit.Timer(setup='from __main__ import doit1', stmt='doit1()') >>> t.timeit() 11.479144930839539 >>> t = timeit.Timer(setup='from __main__ import doit2', stmt='doit2()') >>> t.timeit() 4.6661689281463623 

    Все они подходят в разных контекстах (вот почему они все доступны). Нет глубокого руководящего принципа, кроме родовых утверждений материнства, в отношении ясности, ремонтопригодности и простоты. Некоторые примеры из моего собственного кода:

    1. import sys, os, re, itertools избегает конфликтов имен и предоставляет очень сжатый способ импорта кучи стандартных модулей.
    2. from math import * позволяет писать sin(x) вместо math.sin(x) в математическом коде. Это становится немного рискованным, когда я также импортирую numpy, который удваивается на некоторых из них, но это меня не слишком беспокоит, так как в любом случае они, как правило, одинаковы. Кроме того, я склонен следить за документацией numpy – import numpy as np – что оборачивает проблему полностью.
    3. Я from PIL import Image, ImageDraw потому что именно так представлена ​​документация PIL.
    Python - лучший язык программирования в мире.