也许在IPython中完成代码完成的最简单方法(已通过6.2.1测试,请参见下面的答案以获取与7.1兼容的代码段),而Jupyter则是运行以下代码段:
长话短说from IPython.utils.generics import complete_objectimport win32com.client@complete_object.when_type(win32com.client.DispatchbaseClass)def complete_dispatch_base_class(obj, prev_completions): try: ole_props = set(obj._prop_map_get_).union(set(obj._prop_map_put_)) return list(ole_props) + prev_completions except AttributeError: pass
随着被概述了一些更多的细节本指南,
win32com附带一个脚本,
makepy.py用于产生Python类型对应于一个给定的COM对象的类型库。
对于Word 2016,我们将按以下步骤进行:
C:UsersusernameAppDataLocalContinuumAnaconda3pkgspywin32-221-py36h9c10281_0Libsite-packageswin32comclient>python makepy.py -i "Microsoft Word 16.0 Object Library"Microsoft Word 16.0 Object Library {00020905-0000-0000-C000-000000000046}, lcid=0, major=8, minor=7 >>> # Use these commands in Python pre to auto generate .py support >>> from win32com.client import gencache >>> gencache.EnsureModule('{00020905-0000-0000-C000-000000000046}', 0, 8, 7)
makepy.py当然,遗嘱的位置取决于您的Python发行版本。该脚本
combrowse.py位于同一目录中,可用于查找可用类型库的名称。
有了这个位置,
win32com.client它将自动使用生成的类型,而不是raw类型,
IPyDispatch并且,此时,如果感兴趣的COM对象实际上发布了其可用的属性和方法,则可以在IPython或Jupyter中使用自动完成功能(这不是必需的)。
现在,在您的情况下,通过调用
EnsureDispatch而不是
Dispatch,该
makepy过程的一部分将自动执行,因此您确实应该能够在IPython中获得已发布方法的代码完成:
但是请注意,尽管这确实为方法提供了代码完成功能,但对于属性而言却并非如此。可以使用
_prop_map_get_属性检查那些对象。例如,
wordapp.Selection.Range.Font._prop_map_get_提供字体上所有可用的属性。
如果对IPython的要求不高,还请注意PythonWin shell(位于周围
pkgspywin32Libsite-packagespythonwinPythonwin.exe)具有对属性和方法的内置代码完成支持。
就其本身而言,这表明在IPython中也可以实现相同的目的。
具体而言,
_prop_map_get_可以在中找到依赖于自动完成的逻辑
scintilla.view.CScintillaView._AutoComplete。另一方面,IPython
6.2.1中的代码完成由处理
core.completer.IPCompleter。
IPython.utils.generics.complete_object如上第一个解决方案所示,用于添加自定义代码完成程序的API由提供。一个陷阱是,
complete_object基于
simplegeneric,对于任何给定类型只能提供一个完成程序。幸运的是,由生成的所有类型
makepy都将继承自
win32com.client.DispatchbaseClass。
如果事实证明这是一个问题,则还可以
complete_object通过添加以下五行到
core.completer.Completion.attr_matches:
try: ole_props = set(obj._prop_map_get_).union(set(obj._prop_map_put_)) words += list(ole_props)except AttributeError: pass
相反,IPython将其代码
__dir__补全基于,因此也可以修补
gencache,这是代码生成最终发生的地方,其中包含了一些喜欢的内容
def __dir__(self): return list(set(self._prop_map_get_).union(set(self._prop_map_put_)))
到每个生成的
DispatchbaseClass。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)