Paul
Paul

Reputation: 23

Python namespace in between builtins and global?

As I understand it python has the following outermost namespaces:

Builtin - This namespace is global across the entire interpreter and all scripts running within an interpreter instance.

Globals - This namespace is global across a module, ie across a single file.

I am looking for a namespace in between these two, where I can share a few variables declared within the main script to modules called by it.

For example, script.py:

import Log from Log
import foo from foo

log = Log()
foo()

foo.py:

def foo():
    log.Log('test')  # I want this to refer to the callers log object

I want to be able to call script.py multiple times and in each case, expose the module level log object to the foo method.

Any ideas if this is possible?

It won't be too painful to pass down the log object, but I am working with a large chunk of code that has been ported from Javascript. I also understand that this places constraints on the caller of foo to expose its log object.

Thanks, Paul

Upvotes: 2

Views: 1415

Answers (3)

Paul
Paul

Reputation: 1

Actually, I did figure out what I was looking for.

This hack is actually used PLY and that is where is stumbled across.

The library code can raise a runtime exception, which then gives access to the callers stack.

Upvotes: 0

Alex Martelli
Alex Martelli

Reputation: 881555

There is no namespace "between" builtins and globals -- but you can easily create your own namespaces and insert them with a name in sys.modules, so any other module can "import" them (ideally not using the from ... import syntax, which carries a load of problems, and definitely not using tghe import ... from syntax you've invented, which just gives a syntax error). For example, in script.py:

import sys
import types
sys.modules['yay'] = types.ModuleType('yay')

import Log
import foo

yay.log = Log.Log()
foo.foo()

and in foo.py

import yay

def foo():
  yay.log.Log('test')

Do not fear qualified names -- they're goodness! Or as the last line of the Zen of Python (AKA import this) puts it:

Namespaces are one honking great idea -- let's do more of those!

You can make and use "more of those" most simply -- just qualify your names (situating them in the proper namespace they belong in!) rather than insisting on barenames where they're just not a good fit. There's a bazillion things that are quite easy with qualified names and anywhere between seriously problematic and well-nigh unfeasible for those who're stuck on barenames!-)

Upvotes: 4

Ignacio Vazquez-Abrams
Ignacio Vazquez-Abrams

Reputation: 798546

There is no such scope. You will need to either add to the builtins scope, or pass the relevant object.

Upvotes: 0

Related Questions