##// END OF EJS Templates
Added new capability to the `%load` magic to search the user's namespace for modules, classes, or functions and inspects those to load source....
George Titsworth -
Show More
@@ -3089,7 +3089,7 b' class InteractiveShell(SingletonConfigurable):'
3089 3089 lines = self.history_manager.get_range_by_str(range_str, raw=raw)
3090 3090 return "\n".join(x for _, _, x in lines)
3091 3091
3092 def find_user_code(self, target, raw=True, py_only=False, skip_encoding_cookie=True):
3092 def find_user_code(self, target, raw=True, py_only=False, skip_encoding_cookie=True, search_ns=False):
3093 3093 """Get a code string from history, file, url, or a string or macro.
3094 3094
3095 3095 This is mainly used by magic functions.
@@ -3156,11 +3156,31 b' class InteractiveShell(SingletonConfigurable):'
3156 3156 elif os.path.isdir(os.path.expanduser(tgt)):
3157 3157 raise ValueError("'%s' is a directory, not a regular file." % target)
3158 3158
3159 if search_ns:
3160 obj = None
3161 parts = target.split(".")
3162 try:
3163 if len(parts) >= 1:
3164 obj = self.user_ns[parts[0]]
3165
3166 for new_obj in parts[1:]:
3167 obj = getattr(obj, new_obj)
3168
3169 if obj:
3170
3171 code = oinspect.getsource(obj)
3172 return code
3173 except Exception:
3174 # Either the value wa't in th user_ns or the objects could
3175 # not be inspected. It still might load below, so just pass.
3176 pass
3177
3159 3178 try: # User namespace
3160 3179 codeobj = eval(target, self.user_ns)
3161 3180 except Exception:
3162 3181 raise ValueError(("'%s' was not found in history, as a file, url, "
3163 3182 "nor in the user namespace.") % target)
3183
3164 3184 if isinstance(codeobj, string_types):
3165 3185 return codeobj
3166 3186 elif isinstance(codeobj, Macro):
@@ -272,7 +272,8 b' class CodeMagics(Magics):'
272 272 Usage:\\
273 273 %load [options] source
274 274
275 where source can be a filename, URL, input history range or macro
275 where source can be a filename, URL, input history range, macro, or
276 element in the user namespace
276 277
277 278 Options:
278 279
@@ -285,6 +286,8 b' class CodeMagics(Magics):'
285 286
286 287 -y : Don't ask confirmation for loading source above 200 000 characters.
287 288
289 -n : Include the user's namespace when searching for source code.
290
288 291 This magic command can either take a local filename, a URL, an history
289 292 range (see %history) or a macro as argument, it will prompt for
290 293 confirmation before loading source with more than 200 000 characters, unless
@@ -297,14 +300,18 b' class CodeMagics(Magics):'
297 300 %load -r 5-10 myscript.py
298 301 %load -r 10-20,30,40: foo.py
299 302 %load -s MyClass,wonder_function myscript.py
303 %load -n MyClass
304 %load -n my_module.wonder_function
300 305 """
301 opts,args = self.parse_options(arg_s,'ys:r:')
306 opts,args = self.parse_options(arg_s,'yns:r:')
302 307
303 308 if not args:
304 309 raise UsageError('Missing filename, URL, input history range, '
305 'or macro.')
310 'macro, or element in the user namespace.')
311
312 search_ns = 'n' in opts
306 313
307 contents = self.shell.find_user_code(args)
314 contents = self.shell.find_user_code(args, search_ns=search_ns)
308 315
309 316 if 's' in opts:
310 317 try:
General Comments 0
You need to be logged in to leave comments. Login now