Большинство встроенных типов данных, Python и библиотеки сделать точку возврата же объект (a is b
, а не только a==b
), даже если вы просите за него по-разному. Очень простой пример:становится основной OLE идентификатор объекта для win32com объектов автоматизации
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 object, который имеет только несколько методов, ни одна из которых не относится к вопросу об идентичности объекта. Однако repr()
из _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
?