[Zope-dev] zope.filerepresentation

Hanno Schlichting hanno at hannosch.eu
Thu Oct 1 07:34:31 EDT 2009


On Thu, Oct 1, 2009 at 2:13 AM, Martin Aspeli <optilude+lists at gmail.com> wrote:
> Hanno Schlichting wrote:
>
>> Is there any reason to invent a new API and not just use Python's file API?
>
> I don't know. IReadFile and IWriteFile have been around for ever and are
> used by a number of things in Zope. They have read(), write() and
> size(). The first two are on file, the last one isn't. I'd like to be
> able to use this API as a base, since it's used for things like
> z3c.blobfile already, and is documented as the way to do this kind of
> thing in Philipp's book.

Ok. I have a feeling that Zope3 at various times invented a new
Java-ish API instead of using standard Python protocols. I'd just like
to avoid going down that way even more.

> class IReadFile(Interface):
>     """Provide read access to file data
>     """
>
>     def read():
>         """Return the file data as a str
>         """
>
>     def size():
>         """Return the data length
>         """

This needs a clarification on what kind of length this is. Is it the
length of the binary data? Since these interfaces also know about
encoding, it's otherwise not clear if the size for textual data might
be its Unicode length.

> class ILargeReadFile(IReadFile):
>     """Provide efficient read access to file data
>     """
>
>     def getContentType():
>         """Get the content/MIME type of the file as a string in the form
>         'major/minor'. Return None if this is not known or undefined.
>         """
>
>     name = schema.TextLine(title=u"Filename", readonly=True)
>     encoding = schema.ASCIILine(title=u"Encoding", readonly=True)

encoding only makes sense for text/*, so maybe some small hint at that?

>     def __iter__():
>         """Get an iterator"""
>
>     def next():
>         """See file"""
>
>     def seek():
>         """See file"""
>
>     def tell():
>         """See file"""
>
> class IWriteFile(Interface):
>
>     def write(data):
>         """Update the file data
>         """
>
> class ILargeWriteFile(IWriteFile):
>
>     def write(data):
>         """Write a chunk of data
>         """
>
>     name = schema.TextLine(title=u"Filename", readonly=False)
>     encoding = schema.ASCIILine(title=u"Encoding", readonly=False)
>
>     def tell():
>         """See file"""
>
>     def close():
>         """See file""
>
> I've still got the content type as a method (maybe make it a read-only
> property?) that may return None. That could be in a separate adapter,
> but that feels like overkill to me. :)

There's no standard way to spell "content type", so I don't really
care. On the pure file level it's even called mime type and only
internet data handling uses "content type". So you have to look things
up anyways. Compared to the other attributes/methods "getContentType"
looks like a Java-intruder in otherwise Python naming conventions,
though.

Hanno


More information about the Zope-Dev mailing list