diff --git a/doc/src/sgml/plpython.sgml b/doc/src/sgml/plpython.sgml index 01feab8ec1accab9313154b51fe19c10adf664cc..a623f3509bd56889a7017767c70882aa70b89513 100644 --- a/doc/src/sgml/plpython.sgml +++ b/doc/src/sgml/plpython.sgml @@ -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"> <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. </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> If an SQL null value<indexterm><primary>null value</primary><secondary sortas="PL/Python">PL/Python</secondary></indexterm> is passed to a