Python 两种版本的Sublime文本中的模块对象差异
在我用Python为Sublime文本编写的插件中,我发现了Sublime文本v.2和v.3之间的差异。[在用v.3编写插件后,我将其向后移植到v.2上。] 在Python 两种版本的Sublime文本中的模块对象差异,python,sublimetext,sublime-text-plugin,Python,Sublimetext,Sublime Text Plugin,在我用Python为Sublime文本编写的插件中,我发现了Sublime文本v.2和v.3之间的差异。[在用v.3编写插件后,我将其向后移植到v.2上。] 在sublime.View类中,方法add_regions()采用各种标志。为了在v.2subgrame.DRAW\u-outline中获得选择区域轮廓,在v.3subgrame.DRAW\u-NO\u-FILL中使用了DRAW\u-FILL——开发者似乎只是简单地将v.3中的DRAW\u-outline重命名为DRAW\u-NO\u-FI
sublime.View
类中,方法add_regions()
采用各种标志。为了在v.2subgrame.DRAW\u-outline
中获得选择区域轮廓,在v.3subgrame.DRAW\u-NO\u-FILL
中使用了DRAW\u-FILL——开发者似乎只是简单地将v.3中的DRAW\u-outline
重命名为DRAW\u-NO\u-FILL
在尝试了各种方法之后,我解决了这个问题,因为我意识到,尽管API中没有记录,sublime.DRAW\u OUTLINED
在v.3中也可用(尽管sublime.DRAW\u NO\u FILL
在v.2中不可用)
然而,我很想知道,如果开发人员没有在他的v.3代码中保持sublime.DRAW\u概述的,我可以使用什么方法
我的方法都以使用类的版本号为中心
首先:
sub_text_ver = sublime.version()
if sub_text_ver < 3000:
flags = sublime.DRAW_OUTLINED | sublime.DRAW_EMPTY_AS_OVERWRITE
else:
flags = sublime.DRAW_NO_FILL | sublime.DRAW_EMPTY_AS_OVERWRITE
# Code continues...
我想知道我可以采取什么方法来解决这个问题。我会被迫这么做吗
插件有两个不同的文件,每个版本的Sublime文本一个?是否可以用两个不同的类在一个文件中解析?它能在同一个班级里解决吗?我觉得最好是在遇到这些事情时了解它们,而不是仅仅因为目前的情况已经解决就把它们搁置起来。[显然我不是最有经验的Python程序员。]谢谢。我建议使用try
和语句进行异常处理,以确保获得正确的模块属性:
try:
flags = sublime.DRAW_NO_FILL | sublime.DRAW_EMPTY_AS_OVERWRITE
except AttributeError: # DRAW_NO_FILL was previously named DRAW_OUTLINED
flags = sublime.DRAW_OUTLINED | sublime.DRAW_EMPTY_AS_OVERWRITE
这就是所谓的“请求原谅比允许更容易”(EAFP)编程风格。您编写了一些您知道在某些情况下会引发异常的代码,并编写了一个try
/except
结构,用一个可选的代码位来处理该异常。在Python中,EAFP样式通常比您在if
语句中尝试的“三思而后行”(LBYL)样式更受欢迎,尽管有些情况下LBYL更容易实现。谢谢,这是一个明智的解决方案。然而出于本能,我不喜欢它,知道错误有时会发生,依靠错误的发生来设置正确的属性——这不是很优雅。使用LBYL方法有没有其他方法来解决这个问题?嗯,在某种程度上,我认为你的直觉(如果它们来自其他编程语言)是错误的。异常是Python的核心特性,您不应该刻意避免它们。也就是说,如果您想要LBYL方法,您可以尝试使用hasattr
检查模块对象,查看它具有哪些属性。再次感谢。寻找hasattr
让我找到了这个非常好的SO Q/A:
Traceback (most recent call last):
File "./ExpandSelectionByRegex.py", line 155, in on_change
File "./ExpandSelectionByRegex.py", line 177, in get_regions_flags_sub_text_v3
AttributeError: 'module' object has no attribute 'DRAW_NO_FILL'
try:
flags = sublime.DRAW_NO_FILL | sublime.DRAW_EMPTY_AS_OVERWRITE
except AttributeError: # DRAW_NO_FILL was previously named DRAW_OUTLINED
flags = sublime.DRAW_OUTLINED | sublime.DRAW_EMPTY_AS_OVERWRITE