[python-win32] Wrong default value for optional argument in makepy signature.
Åsmund Hjulstad
asmund.hjulstad at gmail.com
Tue Nov 9 19:03:37 CET 2010
2010/11/9 Tim Roberts <timr at probo.com>:
> Åsmund Hjulstad wrote:
>> I keep getting the following exception when making some calls on a
>> ActiveX DLL library (PISDK). Problem partially solved, posting in case
>> others may find it usefull.
>>
>> TypeError: The Python instance can not be converted to a COM object
>>
>> I have traced it down to an optional parameter, that is set to 0, but
>> should (probably) be set to None.
>>
>> the makepy signature is:
>>
>> GetPoints(self, WhereClause=<PyOleEmpty object>, pAsynchStatus=0)
>>
>> Doing the call using
>>
>> server.GetPoints(" tag = 'FT12345/*' ", None)
>>
>> works fine. ...
>>
>> As the optional parameter is easy to forget, especially when querying
>> interactively in ipython, is it possible to make makepy understand
>> that the optional parameter should be None, instead of 0?
>
> Makepy makes an educated guess, based on the data type of the
> parameter. However, some people lie about their data types when they
> make an interface like this. Instead of declaring it a pointer, they'll
> declare it as an integer. Makepy isn't omniscient.
>
> Do you have the IDL that describes the function, or a web page
> reference? Can you show us the script that makepy generated?
The function is described like this in the accompanying .h file: (
This is from pisdk.h )
virtual /* [helpstring][helpcontext][id] */ HRESULT
STDMETHODCALLTYPE GetPoints(
/* [in] */ BSTR whereClause,
/* [in] */ PointSearchTypeConstants eSearchType,
/* [defaultvalue][in] */ /* external definition not
present */ _NamedValues *pnvExtraTableList,
/* [defaultvalue][in] */ /* external definition not
present */ _NamedValues *pnvServerList,
/* [defaultvalue][in] */ /* external definition not
present */ _PIAsynchStatus *pAsynchStatus,
/* [retval][out] */ _PointList **ret) = 0;
with _PIAsynchStatus described in pisdkcommon.h
interface _PIAsynchStatus
{
CONST_VTBL struct _PIAsynchStatusVtbl *lpVtbl;
};
There are two different DLLs, pisdk.dll and PISDKCommon.dll (which the
first one depends on)
The generated python code for the relevant method is
# Result is of type _PointList
def GetPoints(self, WhereClause=defaultNamedNotOptArg, pAsynchStatus=0):
"""Search for PIPoints on this server."""
ret = self._oleobj_.InvokeTypes(21, LCID, 1, (9, 0), ((8, 1), (9,
49)),WhereClause
, pAsynchStatus)
if ret is not None:
ret = Dispatch(ret, u'GetPoints', '{EF9DDE15-265F-11D2-80F4-00A0240B7FDC}')
return ret
Please let me know if more information can be of help.
More information about the python-win32
mailing list