packages, globals, and __builtin__
Laura Creighton
lac at cd.chalmers.se
Fri May 11 10:09:00 EDT 2001
Okay, consensus is that I should use a module name inside the package.
Confession time. I am already doing this. I've already GOT one, you see.
<whisper whisper ... CUT TO BATTLEMENTS. THE TAUNTER turns to some
others. TAUNTER: `I told 'em we already got one.' They all giggle.>
I just as clearly am doing it wrong. I tried and when it failed, I
concluded that python just absolutely refused to let me have the namespace
I wanted, and cursing I got out the axe of __builtin__ and _really_
forced the issue. So it's really like this:
My client -- not part of the package:
import Tkinter
import Caps.Widgets
[... about 10 lines of not related stuff here ...]
root = Tkinter.Tk()
userPrefs = Caps.Widgets.UserPreferences()
import __builtin__
__builtin__.up = Caps.Widgets.UserPreferences()
controlMediator = Caps.Widgets.ControlMediator(userPrefs)
Tkinter.tkinter.createfilehandler(bl, Tkinter.READABLE, bl_handler)
root.mainloop()
(my main client which doesn't live in the Caps directories)
and then the Caps Widgets. Currently they all get passed userPrefs
as a parameter, and I really don't want this.
This is (some of) the file Caps/Widgets/UserPreferences.py
class UserPreferences:
def __init__(self):
# Trust me on this. You don't want to really see the dictionary
self.prefs = { # Pretend something reasonable goes here }
def getPreferences(self, key):
return self.prefs[key]
It's packed with all sorts of goodies such as English and Swedish text
for all the balloons (tool-tips to some of you), the colours you like ...
(By the way, anybody want to give a shot at translating `Hänvisande'?
`Referring' will not work, since it is already used to mean
something quite different. And `Vaht you _cleecked-on_ t'ge
dis _Outrageous_ _Message_, you _Silly_ _English_ _ K...kanigget'
is unlikely to survive code review. I am using `Forwarding'
now but I am not entirely happy with it.)
Then I do things now like this:
a, b, c, d = self.userPrefs.getPreferences(whatever)
which works because I am passing around userPrefs as a parameter.
I don't want to make a new userpref object in the __init__ of every
Widget. I just want one global reference I can get at whenever I like.
And I thought that this was something that python simply refused to
give me.
Is it my __init.py__ file that is no good? This is Caps/Widgets/__init.py__
import os
import re
dir = __path__[0]
for _file in os.listdir(_dir):
if _file != '__init__.py':
_m = re.match('(.*)\.py$', _file)
if _m != None:
exec('from ' + _m.group(1) + ' import *')
Some day I want to make it do lazy loading, but now now.
What have I badly misunderstood?
Thank you for your time and effort.
Laura
More information about the Python-list
mailing list