Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 两种版本的Sublime文本中的模块对象差异_Python_Sublimetext_Sublime Text Plugin - Fatal编程技术网

Python 两种版本的Sublime文本中的模块对象差异

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

在我用Python为Sublime文本编写的插件中,我发现了Sublime文本v.2和v.3之间的差异。[在用v.3编写插件后,我将其向后移植到v.2上。]

sublime.View
类中,方法
add_regions()
采用各种标志。为了在v.2
subgrame.DRAW\u-outline
中获得选择区域轮廓,在v.3
subgrame.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