Re: PLPython and named arguments

Поиск
Список
Период
Сортировка
Искать
От
Andrey Avakimov
Тема
Re: PLPython and named arguments
Дата
Msg-id
1475588219.350324.21966.19771@mail.rambler.ru
Ответ на
Список
Дерево обсуждения
PLPython and named arguments "Andrey Avakimov" <aquarius1993@rambler.ru>
Re: PLPython and named arguments Tom Lane <tgl@sss.pgh.pa.us>
Re: PLPython and named arguments Adrian Klaver <adrian.klaver@aklaver.com>
Re: PLPython and named arguments "Andrey Avakimov" <aquarius1993@rambler.ru>

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.klaver@aklaver.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 
>           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.klaver@aklaver.com
> 
> -- 
> Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-sql
> 
> 

В списке pgsql-sql по дате отправления
От: Adrian Klaver
Дата:
От: Bujji Babu
Дата:
Сообщение: SQL Bug
FAQ