2014-09-26 2 views
3

Большинство встроенных типов данных, 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 автоматизации. Следующий код подключается к автоматизации , а затем получает два дескриптора для одного и того же объекта таблицы данных. На уровне 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?

ответ

1

* хлопает себя в лицо *

Оказывается, есть довольно простой способ сделать это: http://mail.python.org/pipermail/python-win32/2014-October/013288.html

Хотя оператор is не работает, так как Python объекты различны, Объект == выполняет эту задачу с win32com -обрезанные объекты:

from win32com.client import gencache 
mod = gencache.GetModuleForProgID("JMP.Application") 
app = mod.Application() 
table = app.GetTableHandleFromName("Table1") 
same_table = app.GetTableHandleFromName("Table1") 
print table is same_table, table._oleobj_ is same_table._oleobj_ 
print table==same_table, table._oleobj_==same_table._oleobj_ 
# False, False 
# True, True