special_dragonfly a écrit :
Ben Finney said:
special_dragonfly said:
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.