在开发Python软件包时如何缩短导入语句?

时间:2018-09-30 15:32:30

标签: python setuptools setup.py

我正在设计一个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 :(得分:1)

除我的评论外,我将尝试举一个简短的例子。假设您拥有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,它应该可以工作。

答案 1 :(得分:-1)

这是您要找的吗? https://python-packaging.readthedocs.io/en/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")

这会在./python-packaging-master/funniest/funniest/init.py

中调用joke()

只需更改示例中的文件夹结构,即可简单地调用import funniest

我确定您可以将相同的东西应用到您的包裹中。