[Python-porting] Details about the psycopg porting

Daniele Varrazzo daniele.varrazzo at gmail.com
Mon Jan 24 17:10:30 CET 2011


On Mon, Jan 24, 2011 at 3:20 PM, Antoine Pitrou <solipsis at pitrou.net> wrote:
>
> Hello,
>
>> I've written to the Psycopg mailing list about the details in the
>> psycopg2 porting to Python 3. You can also read everything here:
>> <http://initd.org/psycopg/articles/2011/01/24/psycopg2-porting-python-3-report/>.
>>
>> There is a couple of points still open, so if you want to take a look
>> at them I'd be happy to receive comments before releasing the code.
>
> From your article:
>
>> the data (bytes) from the libpq are passed to file.write() using
>> PyObject_CallFunction(func, "s#", buffer, len)”
>
> You shouldn't use "s#" as it will implicitly decode the buffer to unicode.
> Instead, use "y#" to write bytes.

Yes, the #s is a leftover from before the conversion: I just have to
decide whether it's better to always emit bytes and break on text
files or if to check for the file capability. Because text mode is the
default for open() I think the former would be surprising: I'll go for
the second option if not overly complex (seems trivial if
PyTextIOBase_Type is available in C without the need of importing
anything from Python, annoying otherwise).


>> In binary mode the file always returns bytes (str in py2, unicode in py3)
>
> I suppose you mean "str in py2, bytes in py3".

Yes: fixed, thanks.


>> bytea fields are returned as MemoryView, from which is easy to get bytes
>
> Is this because it is easier for you to return a memoryview? Otherwise it would
> make more sense to return a bytes object.

In Py2 bytea is converted to buffer objects, passing through a "chunk"
object implementing the buffer interface. so yes, MemoryView is a more
direct port.


-- Daniele


More information about the Python-porting mailing list