On 01/06/12 23:13, Tim Chase wrote:
On 06/01/12 15:05, Ethan Furman wrote:
MRAB wrote:
I'd probably think of a record as being more like a dict (or an
OrderedDict)
with the fields accessed by key:

     record["name"]

but:

     record.deleted

Record fields are accessible both by key and by attribute -- by key
primarily for those cases when the field name is in a variable:

      for field in ('full_name','nick_name','pet_name'):
          print record[field]

and since dbf record names cannot start with _ and are at most 10
characters long I've used longer than that method names... but if I want
to support dbf version 7 that won't work.

It seems to me that, since you provide both the indexing notation
and the dotted notation, just ensure that the methods such as

   dbf.scatter_fields

*always* trump and refer to the method.  This allows for convenience

of using the .field_name notation for the vast majority of cases,
but ensures that it's still possible for the user (of your API) to
use the indexing method to do things like

   value = dbf["scatter_fields"]

if they have a thusly-named field name and want its value.

-tkc

I did think about *trumping* one way or the other, but both *ugh*.

Ethan:

I think offering both is over-complicating the design for no gain, and possible complications later. For instance, what if you introduce a method/property called "last" to get the last row of a table, it'll cause some head-scratching as someone will suddenly have to make sure your API changes didn't conflict with their column names (or if they've used yours as a base and introduce methods, doesn't interfere with their users of their version of the library...)

To most developers, I think blah["whatever"] is perfectly clear as looking up a value via key is mostly done that way.

I suppose you could use __getitem__ to grab certain fields in one go ( as per your example - from any iterable that isn't a basestring? - and users would probably enjoy not keep re-typing "record.xxx" and would save you having to invent another possibly conflicting name) such as:

print record['full_name', 'nick_name', 'pet_name']  # looks clean to me

In short I totally agree with MRAB here.

Just my 2p,

Jon.








--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to