how to create/ref globals in an alternate namespace?
James Stroud
jstroud at mbi.ucla.edu
Fri Apr 27 18:31:38 EDT 2007
Steven W. Orr wrote:
> On Friday, Apr 27th 2007 at 14:07 -0700, quoth James Stroud:
>
> =>Steven W. Orr wrote:
> =>> I have two seperate modules doing factory stuff which each have the
> =>> similar function2:
> =>>
> =>> In the ds101 module, def DS101CLASS(mname,data):
> =>> cname = mname+'DS101'
> =>> msg_class = globals()[cname]
> =>> msg = msg_class(data)
> =>> return msg
> =>>
> =>> and in the fdu module,
> =>>
> =>> def FDUCLASS(mname,data):
> =>> cname = mname+'FDU'
> =>> msg_class = globals()[cname]
> =>> msg = msg_class(data)
> =>> return msg
> =>>
> =>> I was thinking I'd be clever and create a common function:
> =>> def procCLASS(mname, objname, data):
> =>> cname = mname+objname
> =>> msg_class = globals()[cname]
> =>> msg = msg_class(data)
> =>> return msg
> =>>
> =>> but the call to globals fouls it all up. Is there a way to write it so
> =>> that the call to globals can be parameterized to be in the context of a
> =>> specific module?
> =>>
> =>> Also, I need to go the other way, a la,
> =>> globals()[name] = nclass
> =>>
> =>> Is this doable?
> =>>
> =>> TIA
> =>>
> =>
> =>Why do you need all of the msg_class(es) global? Why not put them into a
> =>module and import the module where you need them? This would be the
> =>conventional way to avoid such problems.
>
> The idea is that DS101 is being called in a loop in the ds101 module to
> create a lot of msg_classes. The same is true for the FDUCLASS function;
> it creates a lot of classes in a loop.
>
> In addition, I have two other functions, almost alike, in two seperate
> modules (mdefs is a structure with all of the stuff needed to drive the
> loops)
>
> def __InitDS101Classes():
> for m in mdefs:
> mdef = mdefs[m]
> name = mdefs[m]['name']+'DS101'
> nclass = new.classobj(name,(DS101,),{})
> nclass.mdef = mdef
> nclass.mid = m
> globals()[name] = nclass
>
>
> def __InitFDUClasses():
> for m in mdefs:
> mdef = mdefs[m]
> name = mdefs[m]['name']+'FDU'
> nclass = new.classobj(name,(FDU,),{})
> nclass.mdef = mdef
> nclass.mid = m
> globals()[name] = nclass
>
> I'm trying to see if by being clever, I can factor out the common code of
> the four different functions and still end up with what they create ending
> up in the namespaces where they are intended to reside in. Does this make
> sense or am I way off base?
>
>
If I get your intention, the imported module idea still works:
# imported.py
pass
# module1.py
import imported
imported.abc = 2
# module2.py
import module1
import imported
print imported.abc
James
More information about the Python-list
mailing list