Обсуждение: Pl/Python error when import "from __future__"
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.
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.
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.