Как сократить операторы импорта при разработке пакета Python? - PullRequest
0 голосов
/ 30 сентября 2018

Я разрабатываю пакет Python.Пожалуйста, смотрите ниже структуру проекта -

android_py
├── README.md
├── setup.py
└── android_py
    ├── __init__.py
    ├── options.py
    └── android.py

Ниже приведено содержание setup.py -

from setuptools import setup, find_packages

setup(name='android_py',
      version='0.1',
      description='The description goes here',
      url='http://github.com/example_user/android_py',
      author='Bob',
      author_email='abc@example.com',
      license='MIT',
      packages=find_packages(),
      zip_safe=False,
      )

Вы можете успешно установить вышеуказанный пакет, используя python setup.py.Однако, чтобы использовать этот пакет, мне нужно написать длинные import операторы, как показано ниже -

from android_py.android import Android
from android_py.options import Power

my_robot = Android()
my_robot.set_power(Power.On)

Как вы можете видеть, есть следующие две проблемы:

  1. Первый импорт, т. Е. from android_py.android import Android, слишком длинный и неудобный для пользователя, поскольку его трудно запомнить.Я думаю, что что-то более короткое, такое как import android, намного приятнее.
  2. Второй импорт, то есть from android_py.options import Power, проблематичен.Он должен быть импортирован автоматически при первом импорте.

Подскажите, пожалуйста, как перенастроить этот пакет, чтобы преодолеть вышеуказанные проблемы?Обратите внимание, что я использую Python 2.7 (если это имеет значение)!

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

В дополнение к моим комментариям я постараюсь привести короткий пример.Скажем, у вас есть power.py:

class Power:
   On = True 

и в том же пакете android.py:

from . import power

class Android:
    Power = power.Power

В пакете android_py __init__.py:

from .android import Android

Теперь извне в вашем app.py, main.py или в любом другом виде:

from android_py import Android
my_robot = Android()
my_robot.set_power(my_robot.Power.On)

Кстати: я не очень доволен названием пакета android_py.Назовите его также android, нет проблем с android.py в пакете android.Или объясняется в путевых именах: нет проблем с android/android.py.При относительном импорте ., используемом в android.py и __init__.py в приведенном выше примере, он должен работать.

0 голосов
/ 30 сентября 2018

Это то, что вы ищете?https://python -packaging.readthedocs.io / ru / latest / everything.html

Редактировать: Используя код в ссылке, я смог сделать это:

import funniest.funniest
import types

print(dir(funniest))

print([getattr(funniest, a) for a in dir(funniest)
    if isinstance(getattr(funniest, a), types.FunctionType)])

print(funniest.funniest.joke())

print("works")

Это вызывает joke () в ./python-packaging-master/funniest/funniest/init.py

Просто измените структуру папок в примере, и вы можете просто вызватьimport funniest

Я уверен, что вы можете применить то же самое к вашей посылке.

...