Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-packages/IPython/core/magic.py: 40%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

268 statements  

1# encoding: utf-8 

2"""Magic functions for InteractiveShell. 

3""" 

4 

5#----------------------------------------------------------------------------- 

6# Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and 

7# Copyright (C) 2001 Fernando Perez <fperez@colorado.edu> 

8# Copyright (C) 2008 The IPython Development Team 

9 

10# Distributed under the terms of the BSD License. The full license is in 

11# the file COPYING, distributed as part of this software. 

12#----------------------------------------------------------------------------- 

13 

14import os 

15import re 

16import sys 

17from getopt import getopt, GetoptError 

18 

19from traitlets.config.configurable import Configurable 

20from . import oinspect 

21from .error import UsageError 

22from .inputtransformer2 import ESC_MAGIC, ESC_MAGIC2 

23from ..utils.ipstruct import Struct 

24from ..utils.process import arg_split 

25from ..utils.text import dedent 

26from traitlets import Bool, Dict, Instance, observe 

27from logging import error 

28 

29import typing as t 

30 

31#----------------------------------------------------------------------------- 

32# Globals 

33#----------------------------------------------------------------------------- 

34 

35# A dict we'll use for each class that has magics, used as temporary storage to 

36# pass information between the @line/cell_magic method decorators and the 

37# @magics_class class decorator, because the method decorators have no 

38# access to the class when they run. See for more details: 

39# http://stackoverflow.com/questions/2366713/can-a-python-decorator-of-an-instance-method-access-the-class 

40 

41magics: t.Dict = dict(line={}, cell={}) 

42 

43magic_kinds = ('line', 'cell') 

44magic_spec = ('line', 'cell', 'line_cell') 

45magic_escapes = dict(line=ESC_MAGIC, cell=ESC_MAGIC2) 

46 

47#----------------------------------------------------------------------------- 

48# Utility classes and functions 

49#----------------------------------------------------------------------------- 

50 

51class Bunch: pass 

52 

53 

54def on_off(tag): 

55 """Return an ON/OFF string for a 1/0 input. Simple utility function.""" 

56 return ['OFF','ON'][tag] 

57 

58 

59def compress_dhist(dh): 

60 """Compress a directory history into a new one with at most 20 entries. 

61 

62 Return a new list made from the first and last 10 elements of dhist after 

63 removal of duplicates. 

64 """ 

65 head, tail = dh[:-10], dh[-10:] 

66 

67 newhead = [] 

68 done = set() 

69 for h in head: 

70 if h in done: 

71 continue 

72 newhead.append(h) 

73 done.add(h) 

74 

75 return newhead + tail 

76 

77 

78def needs_local_scope(func): 

79 """Decorator to mark magic functions which need to local scope to run.""" 

80 func.needs_local_scope = True 

81 return func 

82 

83#----------------------------------------------------------------------------- 

84# Class and method decorators for registering magics 

85#----------------------------------------------------------------------------- 

86 

87def magics_class(cls): 

88 """Class decorator for all subclasses of the main Magics class. 

89 

90 Any class that subclasses Magics *must* also apply this decorator, to 

91 ensure that all the methods that have been decorated as line/cell magics 

92 get correctly registered in the class instance. This is necessary because 

93 when method decorators run, the class does not exist yet, so they 

94 temporarily store their information into a module global. Application of 

95 this class decorator copies that global data to the class instance and 

96 clears the global. 

97 

98 Obviously, this mechanism is not thread-safe, which means that the 

99 *creation* of subclasses of Magic should only be done in a single-thread 

100 context. Instantiation of the classes has no restrictions. Given that 

101 these classes are typically created at IPython startup time and before user 

102 application code becomes active, in practice this should not pose any 

103 problems. 

104 """ 

105 cls.registered = True 

106 cls.magics = dict(line = magics['line'], 

107 cell = magics['cell']) 

108 magics['line'] = {} 

109 magics['cell'] = {} 

110 return cls 

111 

112 

113def record_magic(dct, magic_kind, magic_name, func): 

114 """Utility function to store a function as a magic of a specific kind. 

115 

116 Parameters 

117 ---------- 

118 dct : dict 

119 A dictionary with 'line' and 'cell' subdicts. 

120 magic_kind : str 

121 Kind of magic to be stored. 

122 magic_name : str 

123 Key to store the magic as. 

124 func : function 

125 Callable object to store. 

126 """ 

127 if magic_kind == 'line_cell': 

128 dct['line'][magic_name] = dct['cell'][magic_name] = func 

129 else: 

130 dct[magic_kind][magic_name] = func 

131 

132 

133def validate_type(magic_kind): 

134 """Ensure that the given magic_kind is valid. 

135 

136 Check that the given magic_kind is one of the accepted spec types (stored 

137 in the global `magic_spec`), raise ValueError otherwise. 

138 """ 

139 if magic_kind not in magic_spec: 

140 raise ValueError('magic_kind must be one of %s, %s given' % 

141 magic_kinds, magic_kind) 

142 

143 

144# The docstrings for the decorator below will be fairly similar for the two 

145# types (method and function), so we generate them here once and reuse the 

146# templates below. 

147_docstring_template = \ 

148"""Decorate the given {0} as {1} magic. 

149 

150The decorator can be used with or without arguments, as follows. 

151 

152i) without arguments: it will create a {1} magic named as the {0} being 

153decorated:: 

154 

155 @deco 

156 def foo(...) 

157 

158will create a {1} magic named `foo`. 

159 

160ii) with one string argument: which will be used as the actual name of the 

161resulting magic:: 

162 

163 @deco('bar') 

164 def foo(...) 

165 

166will create a {1} magic named `bar`. 

167 

168To register a class magic use ``Interactiveshell.register_magic(class or instance)``. 

169""" 

170 

171# These two are decorator factories. While they are conceptually very similar, 

172# there are enough differences in the details that it's simpler to have them 

173# written as completely standalone functions rather than trying to share code 

174# and make a single one with convoluted logic. 

175 

176def _method_magic_marker(magic_kind): 

177 """Decorator factory for methods in Magics subclasses. 

178 """ 

179 

180 validate_type(magic_kind) 

181 

182 # This is a closure to capture the magic_kind. We could also use a class, 

183 # but it's overkill for just that one bit of state. 

184 def magic_deco(arg): 

185 if callable(arg): 

186 # "Naked" decorator call (just @foo, no args) 

187 func = arg 

188 name = func.__name__ 

189 retval = arg 

190 record_magic(magics, magic_kind, name, name) 

191 elif isinstance(arg, str): 

192 # Decorator called with arguments (@foo('bar')) 

193 name = arg 

194 def mark(func, *a, **kw): 

195 record_magic(magics, magic_kind, name, func.__name__) 

196 return func 

197 retval = mark 

198 else: 

199 raise TypeError("Decorator can only be called with " 

200 "string or function") 

201 return retval 

202 

203 # Ensure the resulting decorator has a usable docstring 

204 magic_deco.__doc__ = _docstring_template.format('method', magic_kind) 

205 return magic_deco 

206 

207 

208def _function_magic_marker(magic_kind): 

209 """Decorator factory for standalone functions. 

210 """ 

211 validate_type(magic_kind) 

212 

213 # This is a closure to capture the magic_kind. We could also use a class, 

214 # but it's overkill for just that one bit of state. 

215 def magic_deco(arg): 

216 # Find get_ipython() in the caller's namespace 

217 caller = sys._getframe(1) 

218 for ns in ['f_locals', 'f_globals', 'f_builtins']: 

219 get_ipython = getattr(caller, ns).get('get_ipython') 

220 if get_ipython is not None: 

221 break 

222 else: 

223 raise NameError('Decorator can only run in context where ' 

224 '`get_ipython` exists') 

225 

226 ip = get_ipython() 

227 

228 if callable(arg): 

229 # "Naked" decorator call (just @foo, no args) 

230 func = arg 

231 name = func.__name__ 

232 ip.register_magic_function(func, magic_kind, name) 

233 retval = arg 

234 elif isinstance(arg, str): 

235 # Decorator called with arguments (@foo('bar')) 

236 name = arg 

237 def mark(func, *a, **kw): 

238 ip.register_magic_function(func, magic_kind, name) 

239 return func 

240 retval = mark 

241 else: 

242 raise TypeError("Decorator can only be called with " 

243 "string or function") 

244 return retval 

245 

246 # Ensure the resulting decorator has a usable docstring 

247 ds = _docstring_template.format('function', magic_kind) 

248 

249 ds += dedent(""" 

250 Note: this decorator can only be used in a context where IPython is already 

251 active, so that the `get_ipython()` call succeeds. You can therefore use 

252 it in your startup files loaded after IPython initializes, but *not* in the 

253 IPython configuration file itself, which is executed before IPython is 

254 fully up and running. Any file located in the `startup` subdirectory of 

255 your configuration profile will be OK in this sense. 

256 """) 

257 

258 magic_deco.__doc__ = ds 

259 return magic_deco 

260 

261 

262MAGIC_NO_VAR_EXPAND_ATTR = "_ipython_magic_no_var_expand" 

263MAGIC_OUTPUT_CAN_BE_SILENCED = "_ipython_magic_output_can_be_silenced" 

264 

265 

266def no_var_expand(magic_func): 

267 """Mark a magic function as not needing variable expansion 

268 

269 By default, IPython interprets `{a}` or `$a` in the line passed to magics 

270 as variables that should be interpolated from the interactive namespace 

271 before passing the line to the magic function. 

272 This is not always desirable, e.g. when the magic executes Python code 

273 (%timeit, %time, etc.). 

274 Decorate magics with `@no_var_expand` to opt-out of variable expansion. 

275 

276 .. versionadded:: 7.3 

277 """ 

278 setattr(magic_func, MAGIC_NO_VAR_EXPAND_ATTR, True) 

279 return magic_func 

280 

281 

282def output_can_be_silenced(magic_func): 

283 """Mark a magic function so its output may be silenced. 

284 

285 The output is silenced if the Python code used as a parameter of 

286 the magic ends in a semicolon, not counting a Python comment that can 

287 follow it. 

288 """ 

289 setattr(magic_func, MAGIC_OUTPUT_CAN_BE_SILENCED, True) 

290 return magic_func 

291 

292# Create the actual decorators for public use 

293 

294# These three are used to decorate methods in class definitions 

295line_magic = _method_magic_marker('line') 

296cell_magic = _method_magic_marker('cell') 

297line_cell_magic = _method_magic_marker('line_cell') 

298 

299# These three decorate standalone functions and perform the decoration 

300# immediately. They can only run where get_ipython() works 

301register_line_magic = _function_magic_marker('line') 

302register_cell_magic = _function_magic_marker('cell') 

303register_line_cell_magic = _function_magic_marker('line_cell') 

304 

305#----------------------------------------------------------------------------- 

306# Core Magic classes 

307#----------------------------------------------------------------------------- 

308 

309class MagicsManager(Configurable): 

310 """Object that handles all magic-related functionality for IPython. 

311 """ 

312 # Non-configurable class attributes 

313 

314 # A two-level dict, first keyed by magic type, then by magic function, and 

315 # holding the actual callable object as value. This is the dict used for 

316 # magic function dispatch 

317 magics = Dict() 

318 lazy_magics = Dict( 

319 help=""" 

320 Mapping from magic names to modules to load. 

321 

322 This can be used in IPython/IPykernel configuration to declare lazy magics 

323 that will only be imported/registered on first use. 

324 

325 For example:: 

326 

327 c.MagicsManager.lazy_magics = { 

328 "my_magic": "slow.to.import", 

329 "my_other_magic": "also.slow", 

330 } 

331 

332 On first invocation of `%my_magic`, `%%my_magic`, `%%my_other_magic` or 

333 `%%my_other_magic`, the corresponding module will be loaded as an ipython 

334 extensions as if you had previously done `%load_ext ipython`. 

335 

336 Magics names should be without percent(s) as magics can be both cell 

337 and line magics. 

338 

339 Lazy loading happen relatively late in execution process, and 

340 complex extensions that manipulate Python/IPython internal state or global state 

341 might not support lazy loading. 

342 """ 

343 ).tag( 

344 config=True, 

345 ) 

346 

347 # A registry of the original objects that we've been given holding magics. 

348 registry = Dict() 

349 

350 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC', allow_none=True) 

351 

352 auto_magic = Bool(True, help= 

353 "Automatically call line magics without requiring explicit % prefix" 

354 ).tag(config=True) 

355 @observe('auto_magic') 

356 def _auto_magic_changed(self, change): 

357 self.shell.automagic = change['new'] 

358 

359 _auto_status = [ 

360 'Automagic is OFF, % prefix IS needed for line magics.', 

361 'Automagic is ON, % prefix IS NOT needed for line magics.'] 

362 

363 user_magics = Instance('IPython.core.magics.UserMagics', allow_none=True) 

364 

365 def __init__(self, shell=None, config=None, user_magics=None, **traits): 

366 

367 super(MagicsManager, self).__init__(shell=shell, config=config, 

368 user_magics=user_magics, **traits) 

369 self.magics = dict(line={}, cell={}) 

370 # Let's add the user_magics to the registry for uniformity, so *all* 

371 # registered magic containers can be found there. 

372 self.registry[user_magics.__class__.__name__] = user_magics 

373 

374 def auto_status(self): 

375 """Return descriptive string with automagic status.""" 

376 return self._auto_status[self.auto_magic] 

377 

378 def lsmagic(self): 

379 """Return a dict of currently available magic functions. 

380 

381 The return dict has the keys 'line' and 'cell', corresponding to the 

382 two types of magics we support. Each value is a list of names. 

383 """ 

384 return self.magics 

385 

386 def lsmagic_docs(self, brief=False, missing=''): 

387 """Return dict of documentation of magic functions. 

388 

389 The return dict has the keys 'line' and 'cell', corresponding to the 

390 two types of magics we support. Each value is a dict keyed by magic 

391 name whose value is the function docstring. If a docstring is 

392 unavailable, the value of `missing` is used instead. 

393 

394 If brief is True, only the first line of each docstring will be returned. 

395 """ 

396 docs = {} 

397 for m_type in self.magics: 

398 m_docs = {} 

399 for m_name, m_func in self.magics[m_type].items(): 

400 if m_func.__doc__: 

401 if brief: 

402 m_docs[m_name] = m_func.__doc__.split('\n', 1)[0] 

403 else: 

404 m_docs[m_name] = m_func.__doc__.rstrip() 

405 else: 

406 m_docs[m_name] = missing 

407 docs[m_type] = m_docs 

408 return docs 

409 

410 def register_lazy(self, name: str, fully_qualified_name: str): 

411 """ 

412 Lazily register a magic via an extension. 

413 

414 

415 Parameters 

416 ---------- 

417 name : str 

418 Name of the magic you wish to register. 

419 fully_qualified_name : 

420 Fully qualified name of the module/submodule that should be loaded 

421 as an extensions when the magic is first called. 

422 It is assumed that loading this extensions will register the given 

423 magic. 

424 """ 

425 

426 self.lazy_magics[name] = fully_qualified_name 

427 

428 def register(self, *magic_objects): 

429 """Register one or more instances of Magics. 

430 

431 Take one or more classes or instances of classes that subclass the main 

432 `core.Magic` class, and register them with IPython to use the magic 

433 functions they provide. The registration process will then ensure that 

434 any methods that have decorated to provide line and/or cell magics will 

435 be recognized with the `%x`/`%%x` syntax as a line/cell magic 

436 respectively. 

437 

438 If classes are given, they will be instantiated with the default 

439 constructor. If your classes need a custom constructor, you should 

440 instanitate them first and pass the instance. 

441 

442 The provided arguments can be an arbitrary mix of classes and instances. 

443 

444 Parameters 

445 ---------- 

446 *magic_objects : one or more classes or instances 

447 """ 

448 # Start by validating them to ensure they have all had their magic 

449 # methods registered at the instance level 

450 for m in magic_objects: 

451 if not m.registered: 

452 raise ValueError("Class of magics %r was constructed without " 

453 "the @register_magics class decorator") 

454 if isinstance(m, type): 

455 # If we're given an uninstantiated class 

456 m = m(shell=self.shell) 

457 

458 # Now that we have an instance, we can register it and update the 

459 # table of callables 

460 self.registry[m.__class__.__name__] = m 

461 for mtype in magic_kinds: 

462 self.magics[mtype].update(m.magics[mtype]) 

463 

464 def register_function(self, func, magic_kind='line', magic_name=None): 

465 """Expose a standalone function as magic function for IPython. 

466 

467 This will create an IPython magic (line, cell or both) from a 

468 standalone function. The functions should have the following 

469 signatures: 

470 

471 * For line magics: `def f(line)` 

472 * For cell magics: `def f(line, cell)` 

473 * For a function that does both: `def f(line, cell=None)` 

474 

475 In the latter case, the function will be called with `cell==None` when 

476 invoked as `%f`, and with cell as a string when invoked as `%%f`. 

477 

478 Parameters 

479 ---------- 

480 func : callable 

481 Function to be registered as a magic. 

482 magic_kind : str 

483 Kind of magic, one of 'line', 'cell' or 'line_cell' 

484 magic_name : optional str 

485 If given, the name the magic will have in the IPython namespace. By 

486 default, the name of the function itself is used. 

487 """ 

488 

489 # Create the new method in the user_magics and register it in the 

490 # global table 

491 validate_type(magic_kind) 

492 magic_name = func.__name__ if magic_name is None else magic_name 

493 setattr(self.user_magics, magic_name, func) 

494 record_magic(self.magics, magic_kind, magic_name, func) 

495 

496 def register_alias(self, alias_name, magic_name, magic_kind='line', magic_params=None): 

497 """Register an alias to a magic function. 

498 

499 The alias is an instance of :class:`MagicAlias`, which holds the 

500 name and kind of the magic it should call. Binding is done at 

501 call time, so if the underlying magic function is changed the alias 

502 will call the new function. 

503 

504 Parameters 

505 ---------- 

506 alias_name : str 

507 The name of the magic to be registered. 

508 magic_name : str 

509 The name of an existing magic. 

510 magic_kind : str 

511 Kind of magic, one of 'line' or 'cell' 

512 """ 

513 

514 # `validate_type` is too permissive, as it allows 'line_cell' 

515 # which we do not handle. 

516 if magic_kind not in magic_kinds: 

517 raise ValueError('magic_kind must be one of %s, %s given' % 

518 magic_kinds, magic_kind) 

519 

520 alias = MagicAlias(self.shell, magic_name, magic_kind, magic_params) 

521 setattr(self.user_magics, alias_name, alias) 

522 record_magic(self.magics, magic_kind, alias_name, alias) 

523 

524# Key base class that provides the central functionality for magics. 

525 

526 

527class Magics(Configurable): 

528 """Base class for implementing magic functions. 

529 

530 Shell functions which can be reached as %function_name. All magic 

531 functions should accept a string, which they can parse for their own 

532 needs. This can make some functions easier to type, eg `%cd ../` 

533 vs. `%cd("../")` 

534 

535 Classes providing magic functions need to subclass this class, and they 

536 MUST: 

537 

538 - Use the method decorators `@line_magic` and `@cell_magic` to decorate 

539 individual methods as magic functions, AND 

540 

541 - Use the class decorator `@magics_class` to ensure that the magic 

542 methods are properly registered at the instance level upon instance 

543 initialization. 

544 

545 See :mod:`magic_functions` for examples of actual implementation classes. 

546 """ 

547 # Dict holding all command-line options for each magic. 

548 options_table = None 

549 # Dict for the mapping of magic names to methods, set by class decorator 

550 magics = None 

551 # Flag to check that the class decorator was properly applied 

552 registered = False 

553 # Instance of IPython shell 

554 shell = None 

555 

556 def __init__(self, shell=None, **kwargs): 

557 if not(self.__class__.registered): 

558 raise ValueError('Magics subclass without registration - ' 

559 'did you forget to apply @magics_class?') 

560 if shell is not None: 

561 if hasattr(shell, 'configurables'): 

562 shell.configurables.append(self) 

563 if hasattr(shell, 'config'): 

564 kwargs.setdefault('parent', shell) 

565 

566 self.shell = shell 

567 self.options_table = {} 

568 # The method decorators are run when the instance doesn't exist yet, so 

569 # they can only record the names of the methods they are supposed to 

570 # grab. Only now, that the instance exists, can we create the proper 

571 # mapping to bound methods. So we read the info off the original names 

572 # table and replace each method name by the actual bound method. 

573 # But we mustn't clobber the *class* mapping, in case of multiple instances. 

574 class_magics = self.magics 

575 self.magics = {} 

576 for mtype in magic_kinds: 

577 tab = self.magics[mtype] = {} 

578 cls_tab = class_magics[mtype] 

579 for magic_name, meth_name in cls_tab.items(): 

580 if isinstance(meth_name, str): 

581 # it's a method name, grab it 

582 tab[magic_name] = getattr(self, meth_name) 

583 else: 

584 # it's the real thing 

585 tab[magic_name] = meth_name 

586 # Configurable **needs** to be initiated at the end or the config 

587 # magics get screwed up. 

588 super(Magics, self).__init__(**kwargs) 

589 

590 def arg_err(self,func): 

591 """Print docstring if incorrect arguments were passed""" 

592 print('Error in arguments:') 

593 print(oinspect.getdoc(func)) 

594 

595 def format_latex(self, strng): 

596 """Format a string for latex inclusion.""" 

597 

598 # Characters that need to be escaped for latex: 

599 escape_re = re.compile(r'(%|_|\$|#|&)',re.MULTILINE) 

600 # Magic command names as headers: 

601 cmd_name_re = re.compile(r'^(%s.*?):' % ESC_MAGIC, 

602 re.MULTILINE) 

603 # Magic commands 

604 cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % ESC_MAGIC, 

605 re.MULTILINE) 

606 # Paragraph continue 

607 par_re = re.compile(r'\\$',re.MULTILINE) 

608 

609 # The "\n" symbol 

610 newline_re = re.compile(r'\\n') 

611 

612 # Now build the string for output: 

613 #strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng) 

614 strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:', 

615 strng) 

616 strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng) 

617 strng = par_re.sub(r'\\\\',strng) 

618 strng = escape_re.sub(r'\\\1',strng) 

619 strng = newline_re.sub(r'\\textbackslash{}n',strng) 

620 return strng 

621 

622 def parse_options(self, arg_str, opt_str, *long_opts, **kw): 

623 """Parse options passed to an argument string. 

624 

625 The interface is similar to that of :func:`getopt.getopt`, but it 

626 returns a :class:`~IPython.utils.struct.Struct` with the options as keys 

627 and the stripped argument string still as a string. 

628 

629 arg_str is quoted as a true sys.argv vector by using shlex.split. 

630 This allows us to easily expand variables, glob files, quote 

631 arguments, etc. 

632 

633 Parameters 

634 ---------- 

635 arg_str : str 

636 The arguments to parse. 

637 opt_str : str 

638 The options specification. 

639 mode : str, default 'string' 

640 If given as 'list', the argument string is returned as a list (split 

641 on whitespace) instead of a string. 

642 list_all : bool, default False 

643 Put all option values in lists. Normally only options 

644 appearing more than once are put in a list. 

645 posix : bool, default True 

646 Whether to split the input line in POSIX mode or not, as per the 

647 conventions outlined in the :mod:`shlex` module from the standard 

648 library. 

649 """ 

650 

651 # inject default options at the beginning of the input line 

652 caller = sys._getframe(1).f_code.co_name 

653 arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str) 

654 

655 mode = kw.get('mode','string') 

656 if mode not in ['string','list']: 

657 raise ValueError('incorrect mode given: %s' % mode) 

658 # Get options 

659 list_all = kw.get('list_all',0) 

660 posix = kw.get('posix', os.name == 'posix') 

661 strict = kw.get('strict', True) 

662 

663 preserve_non_opts = kw.get("preserve_non_opts", False) 

664 remainder_arg_str = arg_str 

665 

666 # Check if we have more than one argument to warrant extra processing: 

667 odict = {} # Dictionary with options 

668 args = arg_str.split() 

669 if len(args) >= 1: 

670 # If the list of inputs only has 0 or 1 thing in it, there's no 

671 # need to look for options 

672 argv = arg_split(arg_str, posix, strict) 

673 # Do regular option processing 

674 try: 

675 opts, args = getopt(argv, opt_str, long_opts) 

676 except GetoptError as e: 

677 raise UsageError( 

678 '%s (allowed: "%s"%s)' 

679 % (e.msg, opt_str, " ".join(("",) + long_opts) if long_opts else "") 

680 ) from e 

681 for o, a in opts: 

682 if mode == "string" and preserve_non_opts: 

683 # remove option-parts from the original args-string and preserve remaining-part. 

684 # This relies on the arg_split(...) and getopt(...)'s impl spec, that the parsed options are 

685 # returned in the original order. 

686 remainder_arg_str = remainder_arg_str.replace(o, "", 1).replace( 

687 a, "", 1 

688 ) 

689 if o.startswith("--"): 

690 o = o[2:] 

691 else: 

692 o = o[1:] 

693 try: 

694 odict[o].append(a) 

695 except AttributeError: 

696 odict[o] = [odict[o],a] 

697 except KeyError: 

698 if list_all: 

699 odict[o] = [a] 

700 else: 

701 odict[o] = a 

702 

703 # Prepare opts,args for return 

704 opts = Struct(odict) 

705 if mode == 'string': 

706 if preserve_non_opts: 

707 args = remainder_arg_str.lstrip() 

708 else: 

709 args = " ".join(args) 

710 

711 return opts,args 

712 

713 def default_option(self, fn, optstr): 

714 """Make an entry in the options_table for fn, with value optstr""" 

715 

716 if fn not in self.lsmagic(): 

717 error("%s is not a magic function" % fn) 

718 self.options_table[fn] = optstr 

719 

720 

721class MagicAlias: 

722 """An alias to another magic function. 

723 

724 An alias is determined by its magic name and magic kind. Lookup 

725 is done at call time, so if the underlying magic changes the alias 

726 will call the new function. 

727 

728 Use the :meth:`MagicsManager.register_alias` method or the 

729 `%alias_magic` magic function to create and register a new alias. 

730 """ 

731 def __init__(self, shell, magic_name, magic_kind, magic_params=None): 

732 self.shell = shell 

733 self.magic_name = magic_name 

734 self.magic_params = magic_params 

735 self.magic_kind = magic_kind 

736 

737 self.pretty_target = '%s%s' % (magic_escapes[self.magic_kind], self.magic_name) 

738 self.__doc__ = "Alias for `%s`." % self.pretty_target 

739 

740 self._in_call = False 

741 

742 def __call__(self, *args, **kwargs): 

743 """Call the magic alias.""" 

744 fn = self.shell.find_magic(self.magic_name, self.magic_kind) 

745 if fn is None: 

746 raise UsageError("Magic `%s` not found." % self.pretty_target) 

747 

748 # Protect against infinite recursion. 

749 if self._in_call: 

750 raise UsageError("Infinite recursion detected; " 

751 "magic aliases cannot call themselves.") 

752 self._in_call = True 

753 try: 

754 if self.magic_params: 

755 args_list = list(args) 

756 args_list[0] = self.magic_params + " " + args[0] 

757 args = tuple(args_list) 

758 return fn(*args, **kwargs) 

759 finally: 

760 self._in_call = False