Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python包中正确导入子模块?_Python_Module_Package_Packages_Python Import - Fatal编程技术网

如何在Python包中正确导入子模块?

如何在Python包中正确导入子模块?,python,module,package,packages,python-import,Python,Module,Package,Packages,Python Import,对于如何导入和组织我的子模块,我有点不知所措,我需要一些文献和一些惯例 问题 我们想编写一个用Python编写的新包,它由几个组件组成: 对最终用户有用的类和函数 很少使用的类和函数 仅包本身需要的实用程序类和函数 外部模块 我们考虑这个体系结构: pizzafactory ├── __init__.py ├── salt.py ├── water.py ├── vegetables │   ├── __init__.py │ └── tomatoes.py └── dough

对于如何导入和组织我的子模块,我有点不知所措,我需要一些文献和一些惯例

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

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

我们考虑这个体系结构:

pizzafactory
├── __init__.py
├── salt.py 
├── water.py 
├── vegetables
│   ├── __init__.py 
│   └── tomatoes.py 
└── dough
    ├── __init__.py 
    └── flour.py 
一些考虑
  • 最终用户不需要使用生面团或水等原料
  • 客户只需要
    pizzafactory/\uuuuu init\uuuuuuuuuuuupy
  • 面团厂需要盐和水
  • 顾客可能想在比萨饼上加些西红柿
文件
pizzafactory/\uuuuu init\uuuuu.py
几乎需要所有模块,但因为我们不想用无用的东西污染最终用户的名称空间。我建议悄悄进口成分,但客户可能使用的成分除外:

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

import oven as _oven # External package
面团工厂将需要一些水,但需要使用该子模块(制作面包)的用户可能不想看到

# 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
名称空间,因此最好是损坏导入名称。我重新意识到没有人会这么做,我不知道为什么

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

  • 最小化命名空间占用
  • 帮助最终用户清楚地看到他打算使用的东西
这两种方法都很常见,但可能会污染pizzafactory名称空间,因此最好是损坏导入名称。我重新意识到没有人会这么做,我不知道为什么

Python是一种同意的成人语言,在大多数情况下,我们都不锁门,一切都公开

如果您担心名称空间过于拥挤,那么应该定义
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuPEP8建议,名称混乱只能用于避免命名冲突,所以这可能就是为什么没有人这样做的原因

参见PEP8的章节以及

PEP8是做这类事情的“正确”方法的指南。不过,它不一定是法律的指南。你可以灵活地做你认为适合你的工作,这就引出了我最喜欢的PEP8部分-

如果对包中的代码没有足够的了解,除了PEP8之外,人们可能无法提供更多关于如何完成的建议。如果你有时间的话,雷蒙德·海廷格的演讲值得一看