在了解tkinter
模块时,我遇到了一些变量,例如tkinter.TOP
,tkinter.BOTTOM
,tkinter.NW
等。
我还了解到tkinter
如果用'top'
,'bottom'
,'nw'
等字符串替换它们,它们的工作方式同样合适。
我试图研究这些变量并发现它们只是字符串对象:
>>> import tkinter
>>> tkinter.TOP
'top'
>>> type(tkinter.TOP)
<class 'str'>
我的问题是,如果它们可以被字符串替换,那么这些“模块常量”的用途是什么?它们是否提供某种性能改善?我用谷歌搜索了一段时间但找不到解释。
答案 0 :(得分:2)
Tkinter提供了一个tkinter.constants
模块,其中包含所有常量(又名。Top
,Left
,...)。导入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。
第二 - 如果您知道它是同一个对象,则可以更快地进行比较。
下一步 - 代码完成 - 有效。
如果某些内容发生了变化 - 只需要更改底层部分 - 因为您的代码只是按名称引用它。