1
1
# config.py - package defaults
2
2
# RMM, 4 Nov 2012
3
3
#
4
- # TODO: add ability to read/write configuration files (ala matplotlib)
4
+ # TODO: add ability to read/write configuration files (a la matplotlib)
5
5
6
6
"""Functions to access default parameter values.
7
7
@@ -384,10 +384,13 @@ def use_legacy_defaults(version):
384
384
def _process_legacy_keyword (kwargs , oldkey , newkey , newval , warn_oldkey = True ):
385
385
"""Utility function for processing legacy keywords.
386
386
387
+ .. deprecated:: 0.10.2
388
+ Replace with `_process_param` or `_process_kwargs`.
389
+
387
390
Use this function to handle a legacy keyword that has been renamed.
388
391
This function pops the old keyword off of the kwargs dictionary and
389
392
issues a warning. If both the old and new keyword are present, a
390
- ControlArgument exception is raised.
393
+ ` ControlArgument` exception is raised.
391
394
392
395
Parameters
393
396
----------
@@ -412,6 +415,10 @@ def _process_legacy_keyword(kwargs, oldkey, newkey, newval, warn_oldkey=True):
412
415
Value of the (new) keyword.
413
416
414
417
"""
418
+ # TODO: turn on this warning when ready to deprecate
419
+ # warnings.warn(
420
+ # "replace `_process_legacy_keyword` with `_process_param` "
421
+ # "or `_process_kwargs`", PendingDeprecationWarning)
415
422
if oldkey in kwargs :
416
423
if warn_oldkey :
417
424
warnings .warn (
@@ -424,3 +431,143 @@ def _process_legacy_keyword(kwargs, oldkey, newkey, newval, warn_oldkey=True):
424
431
return kwargs .pop (oldkey )
425
432
else :
426
433
return newval
434
+
435
+
436
+ def _process_param (name , defval , kwargs , alias_mapping , sigval = None ):
437
+ """Process named parameter, checking aliases and legacy usage.
438
+
439
+ Helper function to process function arguments by mapping aliases to
440
+ either their default keywords or to a named argument. The alias
441
+ mapping is a dictionary that returns a tuple consisting of valid
442
+ aliases and legacy aliases::
443
+
444
+ alias_mapping = {
445
+ 'argument_name_1': (['alias', ...], ['legacy', ...]),
446
+ ...}
447
+
448
+ If `param` is a named keyword in the function signature with default
449
+ value `defval`, a typical calling sequence at the start of a function
450
+ is::
451
+
452
+ param = _process_param('param', defval, kwargs, function_aliases)
453
+
454
+ If `param` is a variable keyword argument (in `kwargs`), `defval` can
455
+ be passed as either None or the default value to use if `param` is not
456
+ present in `kwargs`.
457
+
458
+ Parameters
459
+ ----------
460
+ name : str
461
+ Name of the parameter to be checked.
462
+ defval : object or dict
463
+ Default value for the parameter.
464
+ kwargs : dict
465
+ Dictionary of variable keyword arguments.
466
+ alias_mapping : dict
467
+ Dictionary providing aliases and legacy names.
468
+ sigval : object, optional
469
+ Default value specified in the function signature (default = None).
470
+ If specified, an error will be generated if `defval` is different
471
+ than `sigval` and an alias or legacy keyword is given.
472
+
473
+ Returns
474
+ -------
475
+ newval : object
476
+ New value of the named parameter.
477
+
478
+ Raises
479
+ ------
480
+ TypeError
481
+ If multiple keyword aliases are used for the same parameter.
482
+
483
+ Warns
484
+ -----
485
+ PendingDeprecationWarning
486
+ If legacy name is used to set the value for the variable.
487
+
488
+ """
489
+ # Check to see if the parameter is in the keyword list
490
+ if name in kwargs :
491
+ if defval != sigval :
492
+ raise TypeError (f"multiple values for parameter { name } " )
493
+ newval = kwargs .pop (name )
494
+ else :
495
+ newval = defval
496
+
497
+ # Get the list of aliases and legacy names
498
+ aliases , legacy = alias_mapping [name ]
499
+
500
+ for kw in legacy :
501
+ if kw in kwargs :
502
+ warnings .warn (
503
+ f"alias `{ kw } ` is legacy name; use `{ name } ` instead" ,
504
+ PendingDeprecationWarning )
505
+ kwval = kwargs .pop (kw )
506
+ if newval != defval and kwval != newval :
507
+ raise TypeError (
508
+ f"multiple values for parameter `{ name } ` (via { kw } )" )
509
+ newval = kwval
510
+
511
+ for kw in aliases :
512
+ if kw in kwargs :
513
+ kwval = kwargs .pop (kw )
514
+ if newval != defval and kwval != newval :
515
+ raise TypeError (
516
+ f"multiple values for parameter `{ name } ` (via { kw } )" )
517
+ newval = kwval
518
+
519
+ return newval
520
+
521
+
522
+ def _process_kwargs (kwargs , alias_mapping ):
523
+ """Process aliases and legacy keywords.
524
+
525
+ Helper function to process function arguments by mapping aliases to
526
+ their default keywords. The alias mapping is a dictionary that returns
527
+ a tuple consisting of valid aliases and legacy aliases::
528
+
529
+ alias_mapping = {
530
+ 'argument_name_1': (['alias', ...], ['legacy', ...]),
531
+ ...}
532
+
533
+ If an alias is present in the dictionary of keywords, it will be used
534
+ to set the value of the argument. If a legacy keyword is used, a
535
+ warning is issued.
536
+
537
+ Parameters
538
+ ----------
539
+ kwargs : dict
540
+ Dictionary of variable keyword arguments.
541
+ alias_mapping : dict
542
+ Dictionary providing aliases and legacy names.
543
+
544
+ Raises
545
+ ------
546
+ TypeError
547
+ If multiple keyword aliased are used for the same parameter.
548
+
549
+ Warns
550
+ -----
551
+ PendingDeprecationWarning
552
+ If legacy name is used to set the value for the variable.
553
+
554
+ """
555
+ for name in alias_mapping or []:
556
+ aliases , legacy = alias_mapping [name ]
557
+
558
+ for kw in legacy :
559
+ if kw in kwargs :
560
+ warnings .warn (
561
+ f"alias `{ kw } ` is legacy name; use `{ name } ` instead" ,
562
+ PendingDeprecationWarning )
563
+ if name in kwargs :
564
+ raise TypeError (
565
+ f"multiple values for parameter `{ name } ` (via { kw } )" )
566
+ kwargs [name ] = kwargs .pop (kw )
567
+
568
+ for kw in aliases :
569
+ if kw in kwargs :
570
+ if name in kwargs :
571
+ raise TypeError (
572
+ f"multiple values for parameter `{ name } ` (via { kw } )" )
573
+ kwargs [name ] = kwargs .pop (kw )
0 commit comments