Лучшие практики для импорта в пакеты и скрипты Python 3 - PullRequest
0 голосов
/ 05 мая 2018

Рассмотрим эту простую структуру папок:

root
  Package1
    x.py
    y.py
  Package2
    z.py
  Examples
    main.py

Теперь наши требования:

  • x.py нужно импортировать y.py
  • z.py нужно импортировать y.py
  • main.py необходимо импортировать y.py и z.py

Вот что работает:

x.py

import y

def x():
  y()

y.py

def y():
  pass

z.py

import package1.y as y

def z():
  y.y()

main.py

import sys
from os import path
sys.path.append(  path.dirname(  path.dirname( path.abspath(__file__) ) ) )

import package1.y as y
import package2.z as z

y.y()
z.z()

Вопросы:

  1. Это лучший и рекомендуемый способ настройки импорта в Python 3?
  2. Мне действительно не нравится изменять sys.path в main, потому что он сильно связывает предположения о расположении пакетов внутри файла кода. Есть ли способ обойти это?
  3. Мне также действительно не нравятся лишние as y партии в import package1.y as y. Есть ли способ обойти это?

1 Ответ

0 голосов
/ 12 мая 2018

Как всегда, есть два отдельных шага:

  1. Вы пишете код для пространства имен abstract пакетов, которое содержит package1 и package2sys, os, и т. Д. ), но не «Примеры», которые не являются пакетом (поскольку main.py не является модулем).
  2. Вы устанавливаете sys.path соответственно до того, как запустит любой ваш код. Если это ваш собственный (неустановленный) код, есть мест, куда вы можете поместить его , или вы можете написать простую оболочку сценария оболочки для установки PYTHONPATH для вашего python процесса.

Итак, ответы на ваши вопросы

  1. В x.py вы пишете from . import y. (Python 2 поддерживает это, а 3 требует это.)
  2. Как вы установите sys.path, зависит от вашей системы упаковки / среды. Традиционным способом является установка переменной окружения PYTHONPATH для процесса python, но существуют и другие способы, связанные с такими вещами, как модуль site.
  3. from package1 import y - это обычный способ называть вещи только один раз.
...