Re: PLPython and named arguments

From: "Andrey Avakimov" <aquarius1993(at)rambler(dot)ru>
To: "Adrian Klaver" <adrian(dot)klaver(at)aklaver(dot)com>
Cc: "Pgsql Sql" <pgsql-sql(at)postgresql(dot)org>
Subject: Re: PLPython and named arguments
Date: 2016-10-04 13:36:59
Message-ID: 1475588219.350324.21966.19771@mail.rambler.ru
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql


OMG... I feel ashamed that I missed that part of the documentation.
Thank you

Best Regards,
Andrew

> 04.10.2016, 16:22:55 пользователь Adrian Klaver (adrian(dot)klaver(at)aklaver(dot)com) написал:
>
> On 10/04/2016 05:20 AM, Andrey Avakimov wrote:
> > Hello
> >
> > My question is about plpython behavior. In some cases procedure ignores
> > named arguments and raises an error like:
> >
> > UnboundLocalError: local variable 'arg_from' referenced before assignment
>
> Because of this?:
>
> https://www.postgresql.org/docs/9.6/static/plpython-funcs.html
> "
> The arguments are set as global variables. Because of the scoping rules
> of Python, this has the subtle consequence that an argument variable
> cannot be reassigned inside the function to the value of an expression
> that involves the variable name itself, unless the variable is
> redeclared as global in the block. For example, the following won't work:
>
> CREATE FUNCTION pystrip(x text)
>    RETURNS text
> AS $$
>    x = x.strip()   # error
>    return x
> $$ LANGUAGE plpythonu;
>
> because assigning to x makes x a local variable for the entire block,
> and so the x on the right-hand side of the assignment refers to a
> not-yet-assigned local variable x, not the PL/Python function parameter.
> Using the global statement, this can be made to work:
>
> CREATE FUNCTION pystrip(x text)
>    RETURNS text
> AS $$
>    global x
>    x = x.strip()   # ok now
>    return x
> $$ LANGUAGE plpythonu;
>
> But it is advisable not to rely on this implementation detail of
> PL/Python. It is better to treat the function parameters as read-only."
>
> So:
>
> test=# select * from pystrip('test   ');
> ERROR:   UnboundLocalError: local variable 'x' referenced before assignment
> CONTEXT:   Traceback (most recent call last):
>    PL/Python function "pystrip", line 2, in <module>
>      x = x.strip()   # error
> PL/Python function "pystrip"
>
> >
> > This can be solved by using such code:
> >
> > arg_from, arg_to = args
> >
> > But the reasons of such behavior are still unclear.
> >
> > Does anyone faced this thing?
> >
> > I will gladly provide any further information if needed.
> >
> > Best Regards,
> > Andrew
> >
>
> --
> Adrian Klaver
> adrian(dot)klaver(at)aklaver(dot)com
>
> --
> Sent via pgsql-sql mailing list (pgsql-sql(at)postgresql(dot)org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-sql
>
>

In response to

Browse pgsql-sql by date

  From Date Subject
Next Message Bujji Babu 2016-10-06 10:22:23 SQL Bug
Previous Message Adrian Klaver 2016-10-04 13:19:45 Re: PLPython and named arguments