mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-27 08:39:28 +08:00
Add documentation why reassigning PL/Python function parameters in the
function body can have undesirable outcomes. (bug #5232)
This commit is contained in:
parent
16dc6f0cf2
commit
8f649c9ac4
@ -1,4 +1,4 @@
|
|||||||
<!-- $PostgreSQL: pgsql/doc/src/sgml/plpython.sgml,v 1.42 2009/12/15 22:59:53 petere Exp $ -->
|
<!-- $PostgreSQL: pgsql/doc/src/sgml/plpython.sgml,v 1.43 2009/12/19 22:23:21 petere Exp $ -->
|
||||||
|
|
||||||
<chapter id="plpython">
|
<chapter id="plpython">
|
||||||
<title>PL/Python - Python Procedural Language</title>
|
<title>PL/Python - Python Procedural Language</title>
|
||||||
@ -213,6 +213,42 @@ def __plpython_procedure_pymax_23456():
|
|||||||
above. Use of named parameters is usually more readable.
|
above. Use of named parameters is usually more readable.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
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:
|
||||||
|
<programlisting>
|
||||||
|
CREATE FUNCTION pystrip(x text)
|
||||||
|
RETURNS text
|
||||||
|
AS $$
|
||||||
|
x = x.strip() # error
|
||||||
|
return x
|
||||||
|
$$ LANGUAGE plpythonu;
|
||||||
|
</programlisting>
|
||||||
|
because assigning to <varname>x</varname>
|
||||||
|
makes <varname>x</varname> a local variable for the entire block,
|
||||||
|
and so the <varname>x</varname> on the right-hand side of the
|
||||||
|
assignment refers to a not-yet-assigned local
|
||||||
|
variable <varname>x</varname>, not the PL/Python function
|
||||||
|
parameter. Using the <literal>global</literal> statement, this can
|
||||||
|
be made to work:
|
||||||
|
<programlisting>
|
||||||
|
CREATE FUNCTION pystrip(x text)
|
||||||
|
RETURNS text
|
||||||
|
AS $$
|
||||||
|
global x
|
||||||
|
x = x.strip() # ok now
|
||||||
|
return x
|
||||||
|
$$ LANGUAGE plpythonu;
|
||||||
|
</programlisting>
|
||||||
|
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.
|
||||||
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
If an SQL null value<indexterm><primary>null value</primary><secondary
|
If an SQL null value<indexterm><primary>null value</primary><secondary
|
||||||
sortas="PL/Python">PL/Python</secondary></indexterm> is passed to a
|
sortas="PL/Python">PL/Python</secondary></indexterm> is passed to a
|
||||||
|
Loading…
Reference in New Issue
Block a user