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