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 по дате отправления: