On 03/31/2011 09:58 PM, Davi Duarte wrote:
Hello,
I'm using PL/Python in PostegreSQL 9.0.3 and Python 2.6.5, I want to use
a feature of Python 3, Python have an option to import a module from
future version of Python.
In my case, I want to use the Python 3 division module, because it
returns a float division of integers by defaut, which in Python 2.x only
returns an integer, then I need use division module of the Python 3.
So to import a module from a future version, simply:
from __future__ import modulename
In my case I'm importing the division:
from __future__ import division
Python must requires that the import be in the first line of code, then
that is my problem, e.g., when running the function below:
CREATE OR REPLACE FUNCTION test() RETURNS text AS $$
from __future__ import division
a = "8/5"
return eval(a)
$$ LANGUAGE plpython2u;
returns the following error:
SyntaxError: from __future__ imports must occur at the beginning of the file
But "from __future__ ..." is on first line of code.
Has anyone had this error? and what may be this error? a bug in
PL/Python? How can I fix this error?
Thanks,
Davi Duarte.
AFAIK, a CREATE FUNCTION in plpython2u adds a python function definition
right before the code you provide (which is the fuction body, or 'suite'
in python parlance):
def function_name(parameter_list):
your_suite
(it does some other mangling to correct indentation, BTW)
As far as the python interpreter is concerned, 'from __future__ import
...' statement is not at the beginning of the program.
I started looking into this some years ago, but at the time the only
solution I managed to design was using some internal interpreter API,
unsupported and subject to change. My idea was to mangle the parse tree,
not the program source: in theory it would be possible to spot the 'form
__future__ import ...' statement and move it at the top. It also avoids
any problem with indentation. At the time there was no "proper" way to
do that, tho.
I'm afraid there's no solution for your problem at the moment. Well, a
workaround is to multiply one of the division arguments by 1.0,
effectively casting it to float. Note this isn't the same of using
float() itself.
>>> a = "1.0*8/5"
>>> eval(a)
1.6
.TM.
--
Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general