Danny,
It does help. I'm still stuck on part of it though, maybe a little background will help.
To learn more about classes I decided to make a class Map, with many instances that have directions pointing to other Map instances. Each Map has different objects you can find on it, but is still a Map, so I have to customize each one.
So if the only solution involves having names that could collide with builtins, I'd like to do it that way. I recognize the potential for chaos, but none of the names that I am using will collide (crossed fingers) becuase I'm using names like "Backyard", "Kitchen" etc. So,
>>> MyBackyard = Map("MyBackyard")
>>> MyBackyard.setDirections()
set direction for N: MyHouse
set direction for S: TheStreet
>>> MyBackyard.N
MyHouse
etc, where MyHouse and TheStreet are made, via function, into MyHouse = Map("MyHouse") and so forth. Each instance is pickled in its own file named after self.name.
When I load the pickles like this
classNameList = ["Yard","Kitchen","LivingRoom"]
def getPickles():
for name in classNameList:
filepath = "C:\Python24\"+name+".dat"
openedFile = file(filepath,"r")
classInstanceName = pickle.load(openedFile)
classInstanceName.name = classInstanceName
print classInstanceName.name, classInstanceName
Yard <class instance>
Kitchen <class instance>
LivingRoom <class instance>
>>> LivingRoom
<class instance>
>>> Kitchen
name Kitchen not defined
>>> Yard
name Yard not defined
Also, I have done what I'm trying to do successfully by populating a dictionary with class instances named after self.name, which, after the function runs, I can access this way
>>> classDictionary["Yard"]
<class instance>
the thing is I would like to be able to get at Yard's attributes by typing
>>> Yard.anAttribute
garbage cans
at the prompt rather than
>>> Yard = classDictionary["Yard"]
>>> Yard.anAttribute
garbage cans
It's just that I can't pin down how to automate it, say through a loadAllMaps() func.
Thanks again for your helpful advice!
Luke
On 10/19/05, Danny Yoo <[EMAIL PROTECTED]> wrote:
On Wed, 19 Oct 2005, Luke Jordan wrote:
> I've got a bunch of pickled class instances with
> self.name<http://self.name/>attributes, and I would like to assign the
> instances themselves to variables
> named whatever is stored in self.name <http://self.name/> using a function.
> "Can't assign to literal", right? Is there a way to do this?
Hi Luke,
It's technically possible to do this, but discouraged. The reason it's
not so safe is because some of those names might collide with your own
program's names, or with the builtins. So if you start having pickled
instances with names like 'list' or 'open', havoc is bound to ensue.
Furthermore, Python variable names have some physical restrictions that
may interfere with what you're trying to do:
######
>>> 4meUshouldnthave = 42
File "<stdin>", line 1
4meUshouldnthave = 42
^
SyntaxError: invalid syntax
######
(For the gory details on what's allowed in a name "identifier", see:
http://www.python.org/doc/ref/identifiers.html)
A safer way to do that I think you want is to use a separate dictionary
container for those instances. As a concrete example:
######
class Person:
def __init__(self, name):
self.name = name
people_names = ['fred', 'barney', 'wilma', 'betty']
people = {}
for name in people_names:
people[name] = Person(name)
######
Rather than using a direct variable name to refer to the person, we can go
an indirect route, and refer to the corresponding entry in the 'people'
dictionary. Does this make sense? This is safer because there's no
potential to munge up the toplevel, plus the 'name' keys won't have the
restrictions that Python variable names have.
Hope this helps!
_______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor