Re: PLPython and named arguments

Поиск
Список
Период
Сортировка
От Adrian Klaver
Тема Re: PLPython and named arguments
Дата
Msg-id ff3905f6-1954-973c-8314-6a3645299446@aklaver.com
обсуждение исходный текст
Ответ на PLPython and named arguments  ("Andrey Avakimov" <aquarius1993@rambler.ru>)
Ответы Re: PLPython and named arguments  ("Andrey Avakimov" <aquarius1993@rambler.ru>)
Список pgsql-sql
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



В списке pgsql-sql по дате отправления:

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: PLPython and named arguments
Следующее
От: "Andrey Avakimov"
Дата:
Сообщение: Re: PLPython and named arguments