关于python:2个版本的Sublime Text中的模块对象差异

Module object differences in 2 versions of Sublime Text

在我用python编写的一个插件中,我发现了崇高文本v.2和v.3之间的区别。[我将插件向后移植,以便在使用v.3编写插件后与v.2一起使用。]

sublime.View类中,方法add_regions()采用各种标志。为了获得v.2中的选择区域轮廓,使用了v.3中的sublime.DRAW_OUTLINED,使用了v.3中的sublime.DRAW_NO_FILL,开发人员似乎只是简单地将v.3中的DRAW_OUTLINED重命名为DRAW_NO_FILL,因为他们都做了相同的事情。

在尝试了各种方法之后,我解决了这种情况,当时我意识到,虽然API中没有记录,但sublime.DRAW_OUTLINED也可以在V.3中使用(尽管sublime.DRAW_NO_FILL在V.2中不可用)。

但是,我很想知道如果开发人员没有在他的v.3代码中保留sublime.DRAW_OUTLINED,我可以使用哪些方法。

我的方法都以使用类的版本号为中心。

首先:

1
2
3
4
5
6
7
8
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...

其次:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sub_text_ver = sublime.version()

if sub_text_ver < 3000:
    flags = self.get_regions_flags_sub_text_v2()
else:
    flags = self.get_regions_flags_sub_text_v3()

# Code continues to end of method and then...

def get_regions_flags_sub_text_v2(self):
    return sublime.DRAW_OUTLINED | sublime.DRAW_EMPTY_AS_OVERWRITE

def get_regions_flags_sub_text_v3(self):
    return sublime.DRAW_NO_FILL | sublime.DRAW_EMPTY_AS_OVERWRITE

两者都给了我这样一个回溯错误:

1
2
3
4
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'

我想知道我可以采取什么方法来解决这个问题。我会被迫的吗?插件有两个不同的文件,每个版本都有一个。它可以在一个文件中用两个不同的类进行解析吗?是否可以在同一类中解决?我觉得当你遇到这些事情的时候,最好去了解它们,而不是仅仅因为目前的情况已经解决就把它们搁置起来。[很明显我不是最有经验的Python程序员。]谢谢。


我建议使用tryexcept语句进行异常处理,以确保获得正确的模块属性:

1
2
3
4
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语句尝试使用的"look before you leap"(lbyl)样式更受欢迎,尽管在某些情况下,lbyl更容易使用。