在C#中,global using的概念可以用来干燥(不要重复)许多文件中的许多常见using
语句.
现在,我们在许多Python文件中有许多类似的导入.有没有类似的策略可以用来减少我们的样板代码?
在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 *
序曲中的所有名字(LeftSprocket
、FooWidget
等)将立即可用.
这种方法有一些很好的优势:
这就是说,我并不一定建议你为所有的项目制作前奏.它也有一些明显的缺点:
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 Python、Explicit is better than implicit.
以this recent question为例.那里的问题与OP有关,包括导入from PIL import Image
和from tkinter import *
,后者默默地将Image
重新定义为tkinter.Image
.