大多数内置的 Python 数据类型和库都强调返回相同的对象(a is b
,而不仅仅是a==b
),即使您以不同的方式请求它。一个非常简单的例子:
list = [ "foo", "bar", {"name": [1,2,3]} ]
a = list[-1]["name"]
b = list[2].values()[0]
print (a is b) # True!
win32com
但是,自动化返回的多种非标量对象似乎并非如此。以下代码连接到sas-jmp自动化,然后获取同一个数据表对象的两个句柄。在 Python 级别,这两个自动化对象不共享身份:
from win32com.client import gencache
mod = gencache.GetModuleForProgID("JMP.Application")
app = mod.Application()
table = app.GetTableHandleFromName("Table1")
same_table = app.GetTableHandleFromName("Table1")
print table
print same_table
print table is same_table
# <win32com.gen_py.DCD36DE0-78F8-11CF-9E68-0020AF24E9FEx0x1x0.IAutoDataTable instance at 0x54418504>
# <win32com.gen_py.DCD36DE0-78F8-11CF-9E68-0020AF24E9FEx0x1x0.IAutoDataTable instance at 0x54432456>
# False
似乎所有win32com
OLE 自动化对象也有一个_oleobj_
属性。_oleobj_
是一个PyIDispatch 对象,它只有几个方法,这些方法似乎都与对象身份问题无关。但是,repr()
of_oleobj_
似乎指向底层的 OLE 自动化对象:
print table._oleobj_
print same_table._oleobj_
# <PyIDispatch at 0x0000000003459530 with obj at 0x00000000003E2928>
# <PyIDispatch at 0x0000000003459620 with obj at 0x00000000003E2928>
为了确认两个对象引用的是同一个底层 OLE 对象,我使用了解析repr()
字符串并比较十六进制地址 (" obj at 0x...
")。
有没有更好、更简洁的方法来比较 OLE 对象身份win32com
?