python模块常量的重要性

时间:2018-01-24 16:11:16

标签: python python-3.x tkinter constants

在了解tkinter模块时,我遇到了一些变量,例如tkinter.TOPtkinter.BOTTOMtkinter.NW等。

我还了解到tkinter如果用'top''bottom''nw'等字符串替换它们,它们的工作方式同样合适。

我试图研究这些变量并发现它们只是字符串对象:

>>> import tkinter
>>> tkinter.TOP
'top'
>>> type(tkinter.TOP)
<class 'str'>

我的问题是,如果它们可以被字符串替换,那么这些“模块常量”的用途是什么?它们是否提供某种性能改善?我用谷歌搜索了一段时间但找不到解释。

5 个答案:

答案 0 :(得分:2)

Tkinter提供了一个tkinter.constants模块,其中包含所有常量(又名。TopLeft,...)。导入tkinter模块时,会自动导入tkinter.constants

通常你可以这样做:

import tkinter
from tkinter.constants import *

print(TOP)

因此,您无需手动定义代码中需要使用的所有常量。

import tkinter

TOP = "top"
LEFT = "left"

另外,tkinter可能希望将某些常量更改为其他内容。 (将TOP更改为数字3)由于它包含的字节数少于"top",因此占用的空间更少。

使用模块提供的常量可确保在当前实现中始终正确定义常量。

答案 1 :(得分:2)

除非文档说明您可以使用任何一种方法,否则请使用模块中的常量。

这个想法是隐藏了(例如)BOTTOM的实际实现,因此开发人员可以自由地改变它(封装)。例如,他们可能认为整数42的使用效率高于文本“底部”(它可能会)。这种改变会打破任何对文本字符串做出假设的人。

为了输入几个字符,使用基础值不值得冒险。

答案 2 :(得分:1)

我的建议是永远不要使用tkinter常量。我的猜测是它们被添加为更加pythonic,但在我看来,它只是使代码更难阅读。与使用字符串文字相比,它们没有提供性能改进。然而,使用它们是无害的,所以它真的取决于个人偏好。

它们的内部值可能永远不会改变 1 所以使用常量超过它所代表的字符串文字没有任何优势。

使用字符串文字的额外好处是它需要的代码更少。例如,我发现了这个:

something.grid(..., sticky="nsew")

......比这更好:

something.grid(..., sticky=tk.N+tk.S+tk.E+tk.W)

值得注意的是,官方tkinter文档经常显示字符串文字的使用而不是这些常量。例如:

1 Tk - 构建tkinter的库 - 严重地向后兼容非常。这些常数在 years 中没有改变。鉴于常量名称本身反映了常量的实际值,如果值应该改变,那么几乎可以肯定常量的名称也会改变。将一个名为N的常量定义为“top”或“upper”或者新值可能是多么奇怪。

答案 3 :(得分:0)

关于tkinter和python模块的这种常量的一般情况是,你可以根据需要手动覆盖它。这不仅与字符串常量有关,而且与一般配置有关。

我不知道tkinter,但可能它们被用在代码中的某个地方,而tkinter的开发人员希望通过覆盖它们来简单地影响行为。

例如,当using matplotlib,一个用于绘图的包时,你可以做像

这样的事情
import matplotlib as mpl
mpl.rcParams['lines.linewidth'] = 2

设置除默认值以外的绘图的线宽。

答案 4 :(得分:0)

一点是常量意味着单一副本。使用的空间更少,无需GC。

第二 - 如果您知道它是同一个对象,则可以更快地进行比较。

下一步 - 代码完成 - 有效。

如果某些内容发生了变化 - 只需要更改底层部分 - 因为您的代码只是按名称引用它。