> postgres=# do $$ > x = plpy.SPIError('Nazdarek'); > x.spidata = (100, "Some detail", "some hint", None, None); > raise x; > $$ language plpythonu;
Shouldn't that look more like
raise plpy.SPIError(msg="Message", sqlstate="0P001", hint="Turn it on and off again") ?
postgres=# do $$ raise plpy.SPIError(msg="Message", sqlstate="0P001", hint="Turn it on and off again"); $$ language plpythonu; ERROR: TypeError: SPIError does not take keyword arguments CONTEXT: Traceback (most recent call last): PL/Python anonymous code block, line 2, in <module> raise plpy.SPIError(msg="Message", sqlstate="0P001", hint="Turn it on and off again"); PL/Python anonymous code block Time: 1.193 ms
Keyword args are very much the norm for this sort of thing. I recall them being pretty reasonable to deal with in the CPython API too, but otherwise a trivial Python wrapper in the module can easily adapt the interface.
postgres=# do $$ class cSPIError(plpy.SPIError): def __init__( self, message, detail = None, hint = None): self.spidata = (0, detail, hint, None, None,) self.args = ( message, )
x = cSPIError('Nazdarek', hint = 'some hint') raise x $$ language plpythonu; ERROR: cSPIError: Nazdarek HINT: some hint CONTEXT: Traceback (most recent call last): PL/Python anonymous code block, line 8, in <module> raise x PL/Python anonymous code block
This code is working, so it needs explicit constructor for class SPIError