Search Postgresql Archives

Re: Possible bug in PL/Python?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Thanks! I'd missed that part apparently :(

Regards,
Jeroen

Op 17 jan. 2012 om 17:40 heeft Adrian Klaver <adrian.klaver@xxxxxxxxx> het volgende geschreven:

> On Tuesday, January 17, 2012 8:27:19 am Jeroen van Dongen wrote:
>> Hi,
>> 
>> In a current project I've a PL/Python function that uses default
>> parameters, like this:
>> 
>> CREATE FUNCTION auth.create_user(
>>    email text,
>>    initial_password text,
>>    display_name text DEFAULT NULL,
>>    mobile_phone text DEFAULT NULL,
>>    status auth.enum_user_status DEFAULT 'active'
>> ) RETURNS text AS $$
>> ... rest of function ...
>> 
>> Now I try to test if 'display_name' is actually passed or not, and if not
>> set it to something sensible, like so:
>> ...
>>    if display_name is None:
>>        display_name = email[:email.find('@')]
>> ...
>> 
>> And ... that fails with an error stating that 'display_name' is referenced
>> before assignment.
>> However, if I do it like this, it works:
>> ...
>> if display_name is None:
>>        real_display_name = email[:email.find('@')]
>> ...
>> 
>> In straight Python the first example works, however in PL/Python only the
>> second works.
>> 
>> Is this how it is supposed to be and did I perhaps miss something in the
>> docs, or is it a bug?
> 
> http://www.postgresql.org/docs/9.0/interactive/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.
> 
> "
>> 
>> Kind regards,
>> Jeroen
> 
> -- 
> Adrian Klaver
> adrian.klaver@xxxxxxxxx

-- 
Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux