【问题标题】:How to properly import sub-modules in a Python package?如何正确导入 Python 包中的子模块?
【发布时间】:2017-02-23 02:25:04
【问题描述】:

我对如何导入和组织我的子模块有点迷茫,我需要一些文献和一些约定。

问题

我们想编写一个用 Python 编写的由几个组件组成的新包:

  • 对最终用户有用的类和函数
  • 很少使用的类和函数
  • 只有包本身需要的实用程序类和函数
  • 外部模块

我们考虑这种架构:

pizzafactory
├── __init__.py
├── salt.py 
├── water.py 
├── vegetables
│   ├── __init__.py 
│   └── tomatoes.py 
└── dough
    ├── __init__.py 
    └── flour.py 

一些注意事项

  • 最终用户不需要使用生面团或水等原料
  • 客户只需要pizzafactory/__init__.py中描述的比萨饼
  • 面团厂需要盐和水
  • 客户可能想在其比萨饼上添加一些西红柿。

文件pizzafactory/__init__.py 几乎需要所有模块,但是因为我们不想用无用的东西污染最终用户命名空间。除了客户可能使用的成分外,我建议悄悄进口成分:

# pizzafactory/__init__.py
import salt as _salt
import dough as _dough
import vegetables.tomatoes

import oven as _oven # External package

面团工厂需要一些水,但需要使用该子模块(制作面包)的用户可能不想看到water

# pizzafactory/dough/__init__.py
import pizzafactory.water as _water

讨论

首先,我觉得直接导入完整包中的所有内容总是更容易:

import pizzafactory

def grab_tomato():
    return pizzafactory.vegetables.tomatoes.BeefsteakTomato()

或仅需要的元素:

from pizzafactory.vegetables.tomatoes import BeefsteakTomato

def grab_tomato():
    return BeefsteakTomato()

这两种方法都很常见,但可能会污染pizzafactory 命名空间,因此最好修改导入名称。我意识到没有人这样做,我不知道为什么。

问题

在这个通用示例中,我想知道如何正确导入模块、子模块和外部包,以便:

  • 最小化命名空间占用空间
  • 帮助最终用户清楚地看到他打算使用什么

【问题讨论】:

    标签: python module package packages python-import


    【解决方案1】:

    这两种方法都很常见,但它可能会污染 Pizzafactory 命名空间,因此最好修改导入名称。我意识到没有人这样做,我不知道为什么。

    Python 是一种公认​​的成人语言,在大多数情况下,我们让门不锁,一切都敞开着。

    如果您只是担心命名空间过于拥挤,您应该定义 __all__ 并使用单前导下划线。 -- PEP8 建议仅应使用名称修饰来避免命名冲突,所以这可能就是没有人这样做的原因。

    请参阅 PEP8 的 Public and internal interfaces 部分以及 Naming Convensions.

    PEP8 是做这些事情的“正确”方法的指南。不过,它是指南,不一定是法律。你可以灵活地做你认为适合你的包的事情,这导致了我最喜欢的 PEP8 部分 - A Foolish Consistency is the Hobgoblin of Little Minds

    如果对包中的代码没有足够的了解,除了 PEP8 之外,可能无法就其应该如何完成提供太多建议。如果你有时间,Raymond Hettinger 的演讲Beyond PEP 8 值得一看。

    【讨论】:

      猜你喜欢
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      • 2020-01-10
      • 2020-04-29
      • 1970-01-01
      • 2013-05-29
      相关资源
      最近更新 更多