As I read in several places, Objects with the Item() method like should map indexing obj[i] to obj.Item(i).
The problem is: It just does not work for me. After running makepy for the Word 14 Object Library, using
import win32com.client app = win32com.client.Dispatch("Word.Application") app.Dialogs.Item(1) # Succeeds and returns a Library.Dialog Object app.Dialogs[1] # Type Error: 'Dialogs' object does not support indexing
I dug deeper and I found that there is indeed no getitem method in the corresponding class created by makepy. The code responsible I identified in the genpy file is:
def WriteClassBody(self, generator): ... specialItems = {..., "item"=None, ...} for name in names: ... if dispid==pythoncom.DISPID_VALUE: lkey = "value" ... else: lkey = name.lower() if lkey in specialItems and specialItems[lkey] is None: specialItems[lkey] = (entry, ...)
So in principle, it should recognize "item" as special item and remember that it has been there (later there is a section in the code where it checks if "item" was there and adds a getitem method if it was). The problem is that dispid for "item" is actually equal to pythoncom.DISPID_VALUE and therefore the lkey is set to "value" which is not special anymore. You can easily verify that by changing "if dispid==pythoncom.DISPID_VALUE:" to "if dispid==pythoncom.DISPID_VALUE and name.lower() != "item":" and running makepy again; the getitem methods are created and indexing works as it should.