Help with Dictionaries and Classes requested please.

Bruno Desthuilliers bruno.42.desthuilliers at wtf.websiteburo.oops.com
Thu Aug 9 12:07:09 EDT 2007


special_dragonfly a écrit :
> "Ben Finney" <bignose+hates-spam at benfinney.id.au> wrote in message 
> news:87ejic6dkw.fsf at benfinney.id.au...
>> "special_dragonfly" <Dominic at PLEASEASK.co.uk> writes:
>>
>>> I've managed to solve the problem, I really was just being a
>>> dunce.
>> Doubtful; but at this stage we can't tell, because we still don't know
>> what it is you're actually trying to *do*.
>>
>>> Here's how incase anyone is wondering:
>>>
>>> class MyClass:
>>>     def __init__(self):
>>>         name=""
>>> dict={}
>>> dict[0]=[]
>>> dict[0].append(MyClass())
>>> dict[0][0].name="Hello"
>>> print dict[0][0].name
>> It's not clear why you are using the value 0 for a dictionary key
>> here; nor why you're assigning an attribute to an object after
>> creating the object. Neither of them are errors, but without context
>> it's hard to know what advice to give.
>>
> The 0 for a key is just an example. The code I actually have would be just 
> as meaningful at the end of the day. I could have changed MyClass for
> class Animals(object):
>     def __init__(self, name="", type="", age=""):
>         self.name=name
>         self.type=type
>         self.age=age
> 
> dict={'Mouse':[Animals('George','long eared',20)]}
> dict['Mouse'].append(Animals('Benny','hairy',30))
> dict['Cat']=[Animals('Inigo Montoya','spanish',10)]
> 
> and Neil, Bruno has the right idea of what I was trying to do. However, your 
> code came in handy still as I used your code elsewhere.see below.
> 
> def EnterDictionary(FieldsDictionary,key,data):
>     for i in range(0,int(data[6:])):
>         line=myfile.readline()
>         line=line.strip()
>         line=line[6:-1]
>         if key in FieldsDictionary:
>             FieldsDictionary[key].append(FieldClass(*line.split(",")))
>         else:
>             FieldsDictionary[key]=[FieldClass(*line.split(","))]

May I suggest a couple possible improvements ?

First : you're of course free to use any naming convention you like, and 
it's obviously better to stay consistent, but the canonical Python 
convention is to use all_lower for vars, functions (and methods) and 
modules, and MixedCase for classes.

About the code now:

def EnterDictionary(FieldsDictionary,key,data):
     for i in range(0,int(data[6:])):

1/ Golden rule : avoid the use of "magic numbers". This one stands true 
for any languages !-). The usual solution is to use symbolic constants. 
While Python doesn't have real symbolic constant, the convention is to 
write them ALL_UPPER.

2/ range() can be used with only one argument, which then will be use as 
the upper bound. IOW,
   range(0, X)
is the same as
   range(X)

         line=myfile.readline()

3/ where does this 'myfile' comes from ? (hint : don't use globals when 
you can avoid them)


         line=line.strip()
         line=line[6:-1]

4/ magic numbers again, cf /1. Question : does this 6 has anything to do 
with the other one ? What will happen when the file format will change ?

5/ you can do all this in a single line, adding the split() too:
         args = myfile.readline().strip()[XXX:-1].split(",")

 >         if key in FieldsDictionary:
 >             FieldsDictionary[key].append(FieldClass(*line.split(",")))
 >         else:
 >             FieldsDictionary[key]=[FieldClass(*line.split(","))]


If you expect key to most of the times be already in FieldsDictionnary, 
then a try/except block might be a bit faster. If you expect key to not 
be here most of the times, then your solution is right. Note that you 
can also use dict.setdefault(key, default):

# probably bad names but I don't have a clue what they should be
DATA_INDEX_OFFSET = 6
LINE_START = 6
LINE_END = -1

def update_fields_dict(fields_dict, key, data, datafile):
   for i in range(int(data[DATA_INDEX_OFFSET:])):
     args =datafile.readline().strip()[LINE_START:LINE_END].split(",")
     fields_dict.setdefault(key, []).append(FieldClass(*args))

Feel free to take or leave what you consider appropriate here. But by 
all means avoid magic numbers, except possibly for Q&D throw-away 
scripts (and even then...).

HTH

> In future I would ask however, if it's a really stupid question and you feel 
> that the answer can be found either by searching google (because in some 
> cases I don't know what to search for), or in one of the O'reilly books, 
> just say. In either case, if you could refer me to the search term to use or 
> the book to read I'd be grateful.

That's usually what happens then, don't worry.



More information about the Python-list mailing list