##// END OF EJS Templates
ENH: Allow non-dict namespaces. This involves a change in the ipapi for setting user namespaces.
Robert Kern -
Show More
@@ -566,7 +566,46 b' def make_user_ns(user_ns = None):'
566 566 classes in ipython.
567 567 """
568 568
569 raise NotImplementedError
570
571
572 def make_user_global_ns(ns = None):
573 """Return a valid user global namespace.
574
575 Similar to make_user_ns(), but global namespaces are really only needed in
576 embedded applications, where there is a distinction between the user's
577 interactive namespace and the global one where ipython is running."""
578
579 raise NotImplementedError
580
581 # Record the true objects in order to be able to test if the user has overridden
582 # these API functions.
583 _make_user_ns = make_user_ns
584 _make_user_global_ns = make_user_global_ns
585
586
587 def make_user_namespaces(user_ns = None,user_global_ns = None):
588 """Return a valid local and global user interactive namespaces.
589
590 This builds a dict with the minimal information needed to operate as a
591 valid IPython user namespace, which you can pass to the various embedding
592 classes in ipython. The default implementation returns the same dict for
593 both the locals and the globals to allow functions to refer to variables in
594 the namespace. Customized implementations can return different dicts. The
595 locals dictionary can actually be anything following the basic mapping
596 protocol of a dict, but the globals dict must be a true dict, not even
597 a subclass. It is recommended that any custom object for the locals
598 namespace synchronize with the globals dict somehow.
599
600 Raises TypeError if the provided globals namespace is not a true dict.
601 """
602
569 603 if user_ns is None:
604 if make_user_ns is not _make_user_ns:
605 # Old API overridden.
606 # FIXME: Issue DeprecationWarning, or just let the old API live on?
607 user_ns = make_user_ns(user_ns)
608 else:
570 609 # Set __name__ to __main__ to better match the behavior of the
571 610 # normal interpreter.
572 611 user_ns = {'__name__' :'__main__',
@@ -576,18 +615,17 b' def make_user_ns(user_ns = None):'
576 615 user_ns.setdefault('__name__','__main__')
577 616 user_ns.setdefault('__builtins__',__builtin__)
578 617
579 return user_ns
580
581
582 def make_user_global_ns(ns = None):
583 """Return a valid user global namespace.
584
585 Similar to make_user_ns(), but global namespaces are really only needed in
586 embedded applications, where there is a distinction between the user's
587 interactive namespace and the global one where ipython is running."""
618 if user_global_ns is None:
619 if make_user_global_ns is not _make_user_global_ns:
620 # Old API overridden.
621 user_global_ns = make_user_global_ns(user_global_ns)
622 else:
623 user_global_ns = user_ns
624 if type(user_global_ns) is not dict:
625 raise TypeError("user_global_ns must be a true dict; got %r"
626 % type(user_global_ns))
588 627
589 if ns is None: ns = {}
590 return ns
628 return user_ns, user_global_ns
591 629
592 630
593 631 def make_session(user_ns = None, shellclass = None):
@@ -215,10 +215,11 b' class InteractiveShell(object,Magic):'
215 215
216 216 # some minimal strict typechecks. For some core data structures, I
217 217 # want actual basic python types, not just anything that looks like
218 # one. This is especially true for namespaces.
219 for ns in (user_ns,user_global_ns):
220 if ns is not None and type(ns) != types.DictType:
221 raise TypeError,'namespace must be a dictionary'
218 # one. This is especially true for the global namespace.
219 if user_global_ns is not None and type(user_global_ns) is not dict:
220 raise TypeError('global namespace must be a true dict; got %r'
221 % type(user_global_ns))
222
222 223 # Job manager (for jobs run as background threads)
223 224 self.jobs = BackgroundJobManager()
224 225
@@ -260,7 +261,8 b' class InteractiveShell(object,Magic):'
260 261 # the locals argument. But we do carry a user_global_ns namespace
261 262 # given as the exec 'globals' argument, This is useful in embedding
262 263 # situations where the ipython shell opens in a context where the
263 # distinction between locals and globals is meaningful.
264 # distinction between locals and globals is meaningful. For
265 # non-embedded contexts, it is just the same object as the user_ns dict.
264 266
265 267 # FIXME. For some strange reason, __builtins__ is showing up at user
266 268 # level as a dict instead of a module. This is a manual fix, but I
@@ -290,14 +292,12 b' class InteractiveShell(object,Magic):'
290 292 # These routines return properly built dicts as needed by the rest of
291 293 # the code, and can also be used by extension writers to generate
292 294 # properly initialized namespaces.
293 user_ns = IPython.ipapi.make_user_ns(user_ns)
294 user_global_ns = IPython.ipapi.make_user_global_ns(user_global_ns)
295 user_ns, user_global_ns = IPython.ipapi.make_user_namespaces(user_ns,
296 user_global_ns)
295 297
296 298 # Assign namespaces
297 299 # This is the namespace where all normal user variables live
298 300 self.user_ns = user_ns
299 # Embedded instances require a separate namespace for globals.
300 # Normally this one is unused by non-embedded instances.
301 301 self.user_global_ns = user_global_ns
302 302 # A namespace to keep track of internal data structures to prevent
303 303 # them from cluttering user-visible stuff. Will be updated later
@@ -2066,16 +2066,7 b' want to merge them back into the new files.""" % locals()'
2066 2066 try:
2067 2067 try:
2068 2068 self.hooks.pre_runcode_hook()
2069 # Embedded instances require separate global/local namespaces
2070 # so they can see both the surrounding (local) namespace and
2071 # the module-level globals when called inside another function.
2072 if self.embedded:
2073 2069 exec code_obj in self.user_global_ns, self.user_ns
2074 # Normal (non-embedded) instances should only have a single
2075 # namespace for user code execution, otherwise functions won't
2076 # see interactive top-level globals.
2077 else:
2078 exec code_obj in self.user_ns
2079 2070 finally:
2080 2071 # Reset our crash handler in place
2081 2072 sys.excepthook = old_excepthook
General Comments 0
You need to be logged in to leave comments. Login now