<type>real</type> and <type>double</type> are converted to
Python <type>float</type>.
</para>
</listitem>
<listitem>
<para>
PostgreSQL <type>numeric</type> is converted to
Python <type>Decimal</type>. This type is imported from
the <literal>cdecimal</literal> package if that is available.
Otherwise,
<literal>decimal.Decimal</literal> from the standard library will be
used. <literal>cdecimal</literal> is significantly faster
than <literal>decimal</literal>. In Python 3.3 and up,
however, <literal>cdecimal</literal> has been integrated into the
standard library under the name <literal>decimal</literal>, so there is
no longer any difference.
</para>
</listitem>
<listitem>
<para>
PostgreSQL <type>bytea</type> is converted to Python <type>bytes</type>.
</para>
</listitem>
<listitem>
<para>
All other data types, including the PostgreSQL character string types,
are converted to a Python <type>str</type> (in Unicode like all Python
strings).
</para>
</listitem>
<listitem>
<para>
For nonscalar data types, see below.
</para>
</listitem>
</itemizedlist>
</para>
<para>
When a PL/Python function returns, its return value is converted to the
function's declared PostgreSQL return data type as follows:
<itemizedlist>
<listitem>
<para>
When the PostgreSQL return type is <type>boolean</type>, the
return value will be evaluated for truth according to the
<emphasis>Python</emphasis> rules. That is, 0 and empty string
are false, but notably <literal>'f'</literal> is true.
</para>
</listitem>
<listitem>
<para>
When the PostgreSQL return type is <type>bytea</type>, the return value
will be converted to Python <type>bytes</type> using the respective
Python built-ins, with the result being converted to
<type>bytea</type>.
</para>
</listitem>
<listitem>
<para>
For all other PostgreSQL return types, the return value is converted
to a string using the Python built-in <literal>str</literal>, and the
result is passed to the input function of the PostgreSQL data type.
(If the Python value is a <type>float</type>, it is converted using
the <literal>repr</literal> built-in instead of <literal>str</literal>, to
avoid loss of precision.)
</para>
<para>
Strings are automatically converted to the PostgreSQL server encoding
when they are passed to PostgreSQL.
</para>
</listitem>
<listitem>
<para>
For nonscalar data types, see below.
</para>
</listitem>
</itemizedlist>
Note that logical mismatches between the declared PostgreSQL
return type and the Python data type of the actual return object
are not flagged; the value will be converted in any case.
</para>
</sect2>
<sect2 id="plpython-data-null">
<title>Null, None</title>
<para>
If an SQL null value<indexterm><primary>null value</primary><secondary
sortas="PL/Python">in PL/Python</secondary></indexterm> is passed to a
function, the argument value will appear as <symbol>None</symbol> in
Python. For example, the function definition of <function>pymax</function>
shown in <xref linkend="plpython-funcs"/> will return the wrong answer for null
inputs. We could add <literal>STRICT</literal> to the function definition
to make <productname>PostgreSQL</productname> do something more reasonable:
if a null value is passed, the function will not be called at all,
but will just return a null result automatically. Alternatively,
we could check for null inputs in the function body:
<programlisting>
CREATE FUNCTION pymax (a integer, b integer)
RETURNS integer
AS $$
if (a is None) or (b is None):
return None