Search Postgresql Archives

Re: Pl/Python error when import "from __future__"

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux