在C#中,global using的概念可以用来干燥(不要重复)许多文件中的许多常见using语句.

现在,我们在许多Python文件中有许多类似的导入.有没有类似的策略可以用来减少我们的样板代码?

推荐答案

你可以创建一个"前奏"模块,它的唯一目的就是让其他模块达到glob imported.这个 idea 可以在其他编程语言中找到,比如Rust的std::prelude和Haskell的Prelude.

例如,创建一个prelude.py文件,其内容如下

from .sprockets import LeftSprocket, RightSprocket, make_sprocket
from .widgets import FooWidget, BarWidget
from .util import sprocket2widget, widget2sprokect

然后从您想要使用它的任何脚本中,将其导入为

from my_package.my_module.prelude import *

序曲中的所有名字(LeftSprocketFooWidget等)将立即可用.

这种方法有一些很好的优势:

  • It's entirely optional to the end users.个用户可以自由 Select 是使用前奏还是显式导入他们需要的模块.
  • It's non-invasive to the rest of your package.提供前奏不需要修改任何其他模块或以其他方式重新组织您的包.

这就是说,我并不一定建议你为所有的项目制作前奏.它也有一些明显的缺点:

  • There's now multiple modules that export the same names,因此,IDE可能更难自动完成导入.您可能会在IDE中建议使用类似my_package.my_module.prelude import FooWidget而不是my_package.my_module.widget import FooWidget的代码.这也会让用户感到困惑,如果不对两个模块进行调查,他们就不知道这两个模块的FooWidget是相同还是不同.

  • It makes it less obvious where global names are coming from.如果您全局导入一个前奏,没有简单的方法来辨别哪些名称可用以及它们来自哪些模块.这与Zen of PythonExplicit is better than implicit.

  • this recent question为例.那里的问题与OP有关,包括导入from PIL import Imagefrom tkinter import *,后者默默地将Image重新定义为tkinter.Image.

另请参见Why is "import *" bad?.

Python相关问答推荐

Python中使用时区感知日期时间对象进行时间算术的Incredit

如何使用pandasDataFrames和scipy高度优化相关性计算

Matlab中是否有Python的f-字符串等效物

运行总计基于多列pandas的分组和总和

沿着数组中的轴计算真实条目

try 将一行连接到Tensorflow中的矩阵

将9个3x3矩阵按特定顺序排列成9x9矩阵

Python Pandas获取层次路径直到顶层管理

如何在FastAPI中为我上传的json文件提供索引ID?

无论输入分辨率如何,稳定扩散管道始终输出512 * 512张图像

在单次扫描中创建列表

在Python中计算连续天数

替换现有列名中的字符,而不创建新列

Flask运行时无法在Python中打印到控制台

无法在Spyder上的Pandas中将本地CSV转换为数据帧

Python—在嵌套列表中添加相同索引的元素,然后计算平均值

pytest、xdist和共享生成的文件依赖项

如何关联来自两个Pandas DataFrame列的列表项?

如何在Polars中创建条件增量列?

在Pandas 中以十六进制显示/打印列?