Changing behaviour of namespaces - solved, I think

Peter Otten __peter__ at web.de
Thu Sep 21 10:16:03 EDT 2006


Mikael Olofsson wrote:

> Peter Otten wrote:
>> To feed an arbitrary mapping object to execfile() you need to upgrade to
>> Python 2.4.
> 
> Thanks! As clear as possible. I will do that.
> 
> FYI: I think I managed to achieve what I want in Py2.3 using the
> compiler module:
> 
>     def getNamesFromAstNode(node,varSet):
>         if node.__class__ in (compiler.ast.Global,compiler.ast.Import):
>             varSet.union_update(node.names)
>         if node.__class__ in (compiler.ast.Name,):
>             varSet.add(node.name)
>         for subNode in node.getChildNodes():
>             getNamesFromAstNode(subNode,varSet)
> 
>     # Get all variable names that are referenced in the file:
>     varSet = sets.Set()
>     mainNode = compiler.parseFile(filePath)
>     getNamesFromAstNode(mainNode,varSet)
> 
>     # Define a namespace and update it:
>     ns = {}
>     for varName in varSet:
>         ns[varName] = dummyObject
> 
>     # Execute the file without NameErrors:
>     execfile(filePath,ns)
> 
> Batteries included!

Clearly more elegant than:

>>> print open(filename).read()
b = a
>>> dummy = 42
>>> names = []
>>> while 1:
...     ns = dict((n, dummy) for n in names)
...     try:
...             execfile(filename, ns)
...     except NameError, e:
...             names.append(e[0][6:-16])
...     else:
...             break
...
>>> names
['a']

:-)

Peter



More information about the Python-list mailing list