Python 为什么bokeh教程使用显式导入而不是别名?

Python 为什么bokeh教程使用显式导入而不是别名?,python,bokeh,Python,Bokeh,在我查看Bokeh软件包时,我注意到教程使用了明确的导入语句,如Bokeh.plotting import figure的和numpy import linspace的。我通常会尽量避免这些,例如,将numpy导入为np,将matplotlib.pyplot导入为plt。我认为这被认为是良好的实践,因为它有助于避免名称空间污染 是否有任何原因导致Bokeh偏离此做法,和/或是否有用于Bokeh导入的常见别名(例如,导入Bokeh.plotting as bp)?从库中导入单个名称并不是真正的“污

在我查看Bokeh软件包时,我注意到教程使用了明确的导入语句,如Bokeh.plotting import figure的
和numpy import linspace的
。我通常会尽量避免这些,例如,
将numpy导入为np
将matplotlib.pyplot导入为plt
。我认为这被认为是良好的实践,因为它有助于避免名称空间污染


是否有任何原因导致Bokeh偏离此做法,和/或是否有用于Bokeh导入的常见别名(例如,
导入Bokeh.plotting as bp
)?

从库中导入单个名称并不是真正的“污染”。您要避免的是从somelibrary导入中执行
*
。这是不同的,因为您不知道将导入哪些名称,因此无法确保不会发生名称冲突


相反,从numpy import linspace执行
只会创建一个名称
linspace
。这与创建普通变量(如
linspace=2
)或使用
def linspace
定义自己的函数没有什么不同。没有意外名称冲突的危险,因为您确切地知道要在本地命名空间中创建哪些名称。

因为
bokeh
有许多不同的子模块,您可以从中提取
bokeh.plotting
之外的绘图函数,没有一个包罗万象的包可以导入以访问所有函数。解决这个问题的一种方法是在一个单独的文件中创建您自己的子包,该文件将导入您希望在主文件中访问的所有函数。例如,您可以在与主脚本相同的目录中创建文件名
my_bokeh.py
,并输入以下导入(例如):

现在,在主脚本中,您可以将此子包导入为:

import my_bokeh as bpt
...
bpt.figure(x_range=bpt.Range1d(0,x-1,bounds='auto'),
           y_range=bpt.Range1d(0,y-1,bounds='auto'),
           plot_width=200, plot_height=200)
...
p.add_tools(bpt.ResizeTool())
...
bpt.show(p)

正如上面的脚本所示,您可以访问
bpt
别名下的每个函数,并且可以保持主脚本中的import语句干净。

任何一种方法都可以,即“名称空间”是关于您想要放入的内容,显式使用import将内容放入名称空间是一种选择。要避免的主要事情是导入,
*
导入,因为它们可能会对实际导入的内容产生混淆。bokeh中的绘图使用许多不同的子模块,而这些子模块并不都存在于
bokeh中。Plotting
。例如,
bokeh.models
bokeh.layouts
bokeh.models.widgets
,等等。它们通常只是从中导入所需的函数,而不是为所有内容提供新的缩写。@tmwilson26这很有意义。也许这有点牵强,但有没有办法将所有my bokeh导入“捆绑”到一个通用别名下?一种方法是将所有导入语句放在一个单独的文件中,导入您希望可用的函数(或者*如果您想冒险)。然后可以使用别名将该文件导入主文件。类似于
将my_bokeh_函数作为bpt导入
。该文件中可用的任何函数都将在
bpt
别名下提供给主程序。@tmwilson26非常好的建议。如果你把你的评论合并成一个答案,我很乐意接受。我明白你的观点,但它确实偏离了matplotlib或numpy的常见教程。我通常喜欢常用的别名,因为它很清楚(阅读代码的其他人也很清楚)图
所属的模块。回到我的问题,我想知道是否有不使用别名的具体原因,如果你想使用,是否有bokeh的标准别名。@Peter9192:这取决于你想做什么。matplotlib或numpy的“通用教程”通常使用库中的许多函数,而不仅仅是一个或两个函数,因此导入模块而不是从numpy import执行
。如果您正在查看的代码实际上只使用一个或两个numpy函数,那么只导入这些函数是有意义的。在许多情况下,这只是个人喜好的问题。至于bokeh是否有一个标准的缩写,我不知道。
import my_bokeh as bpt
...
bpt.figure(x_range=bpt.Range1d(0,x-1,bounds='auto'),
           y_range=bpt.Range1d(0,y-1,bounds='auto'),
           plot_width=200, plot_height=200)
...
p.add_tools(bpt.ResizeTool())
...
bpt.show(p)