Re: PLPython and named arguments

Поиск
Список
Период
Сортировка
От Andrey Avakimov
Тема Re: PLPython and named arguments
Дата
Msg-id 1475588219.350324.21966.19771@mail.rambler.ru
обсуждение исходный текст
Ответ на Re: PLPython and named arguments  (Adrian Klaver <adrian.klaver@aklaver.com>)
Список 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.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 <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.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
Дата:
Сообщение: Re: PLPython and named arguments
Следующее
От: Bujji Babu
Дата:
Сообщение: SQL Bug