Thread: PLPython and named arguments
<p><span style="font-family: 'Courier New','Courier';">Hello</span><p><span style="font-family: 'Courier New','Courier';">Myquestion is about plpython behavior. In some cases procedure ignores named arguments and raises an errorlike:</span><p><span style="font-family: 'Courier New','Courier';">UnboundLocalError: local variable 'arg_from' referencedbefore assignment</span><p><p><span style="font-family: 'Courier New','Courier';">This can be solved by using suchcode:</span><p><span style="font-family: 'Courier New','Courier';">arg_from, arg_to = args</span><p><span style="font-family:'Courier New','Courier';">But the reasons of such behavior are still unclear.<br /></span><p><span style="font-family:'Courier New','Courier';">Does anyone faced this thing? </span><p><span style="font-family: 'Courier New','Courier';">Iwill gladly provide any further information if needed.</span><p><p><span style="font-family: 'Courier New','Courier';">BestRegards,</span><br /><span style="font-family: 'Courier New','Courier';">Andrew</span>
"Andrey Avakimov" <aquarius1993@rambler.ru> writes: > 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 Let's see an example? regards, tom lane
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
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 > >