Mucking with the calling scripts namespace (For a good reason, honest!)
Doug Rosser
da_rosser at yahoo.com
Tue Aug 3 15:20:55 EDT 2004
Thank you for your help Larry. Let me see if I've got this straight:
1. Python doesn't provide an obvious way to modify the __main__
namespace. You can peek at values with "global" but you can't treat it
like a dictionary at runtime.
2. If you need to access objects that won't have names until run-time
(but you incidentally -KNOW- their names and want to reference them in
a bit of code), encapsulate them in a container. This effectively
creates a new not-really namespace, as the objects in the container
become attributes.
Well, all-in-all, I'd really still rather have #1, but I can live with
#2.
da rosser
-- We are the music makers, and we are the dreamers of dreams --
"Larry Bates" <lbates at swamisoft.com> wrote in message news:<rJudnRiTPvRB8JPcRVn-gw at comcast.com>...
> I would suggest following:
>
> 1) Change the config file into proper format for
> ConfigParser module.
>
> [server_001]
> hostname=alpha
> os=posix
>
> [server_002]
> hostname=beta
> os=win
>
> [client_001]
> hostname=ichi
> os=posix
>
> [client_002]
> hostname=ni
> os=posix
>
> This makes it easy to define up to 999 servers and
> 999 clients (just make the counter longer if you
> require more).
>
> 2) Create classes to hold information/methods that
> will work on each server/client.
>
> class server:
> def __init__(self, server_id, name, os):
> self.id=server_id
> self.name=name
> self.os=os
> return
>
> def dosomething(self):
> #
> # Insert code here to do something on this
> # server.
> #
> return
>
> 3) Create class to hold servers/clients (I'll leave
> the one to handle clients to you).
>
> class servers:
> def __init__(self, INI):
> #
> # Create an index pointer for next method
> #
> self.next_index=0
> #
> # Create a list to hold server names
> #
> self.names=[]
> serverlist=[x for x in INI.sections if
> INI.sections.beginswith('server')]
> serverlist.sort() # If you want to keep them in order
> #
> # Loop over each server entry
> #
> for server_id in serverlist:
> name=INI.get(server_id, 'name')
> os=INI.get(server_id, 'os')
> self.append(id, name, os)
>
> return
>
> def append(self, server_id, name, os):
> #
> # Create server instance and append to list of servers
> #
> self.names.append(server_id)
> self.__dict__[name]=server(server_id, name, os)
> return
>
> def __iter__(self):
> return self
>
> def next(self):
> #
> # Try to get the next route
> #
> try: SERVER=self.names[self.next_index]
> except:
> self.next_index=0
> raise StopIteration
> #
> # Increment the index pointer for the next call
> #
> self.next_index+=1
> return SERVER
>
> In your programt do something like:
>
> import ConfigParser
>
> INI=ConfigParser.ConfigParser()
> INI.read(inifilepath)
>
> SERVERS=servers(INI)
>
> Now you can access
>
> SERVERS.server_001.name
> SERVERS.server_001.os
>
> or call methods via
>
> SERVERS.server_001.dosomething()
>
> or you can easily loop over them
>
> for SERVER in SERVERS:
> SERVER.dosomething()
>
> or
>
> print SERVERS.names
>
> Code not tested, but I hope it helps.
>
> Larry Bates
> Syscon, Inc.
>
>
>
> "Doug Rosser" <da_rosser at yahoo.com> wrote in message
> news:e08cd05f.0408020727.15ce4356 at posting.google.com...
> > I'm writing a fairly complicated test framework and keeping
> > configuration data inside ini files that are parsed at runtime by the
> > ConfigParser module.
> >
> > For example, there would be a section similar to the following
> >
> > [servers]
> > server1:{'hostname':'alpha','os':'posix'}
> > server2:{'hostname':'beta','os':'win'}
> >
> > [clients]
> > client1:{'hostname':'ichi','os':'posix'}
> > client2:{'hostname':'ni','os':'posix'}
> >
> > As I read the configuration file, I don't actually create instances,
> > but use the data to check "what's out there" to make sure the physical
> > network environment has the bits and pieces required to run a
> > particular test. This is a sort of "go/no-go" resource check.
> >
> > Assuming that everything is correct with the physical network
> > environment, I want my testers to be able to refer to these resources
> > in their python scripts by the names in the ini file, like so:
> >
> > myTest.checkResources() # Read the config file and associate names
> > with real
> > # life instances
> >
> > server1.doSomething() # Note how I have cleverly saved myself from
> > declaring
> > # "server1" because the module myTest has
> > inserted
> > # it into the right namespace :-)
> >
> > Down to business: How do I write a module that can insert these names
> > into the calling script's namespace at runtime? Is this even possible
> > in Python?
> >
> > da rosser
> > -- We are the music makers, and we are the dreamers of dreams --
More information about the Python-list
mailing list