[Python-porting] Details about the psycopg porting

Antoine Pitrou solipsis at pitrou.net
Mon Jan 24 17:21:03 CET 2011


Daniele Varrazzo <daniele.varrazzo at ...> writes:
> >> 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).

No, you'll have to import. The actual TextIOBase ABC is declared in Python.
(see Lib/io.py if you are curious)

> >> 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.

Well, does it point to some external memory managed by pgsql itself? Otherwise 
bytes or bytearray would still be a better choice IMO (as in better-known and 
more practical). In 3.x there's no confusion between 8-bit strings and unicode 
strings, so use of an obscure type such as buffer() shouldn't be necessary.

Regards

Antoine.




More information about the Python-porting mailing list