@@ -296,7 +296,7 @@ def _get_measure(da: Union[DataArray, Dataset], key: str) -> List[str]:
296
296
#: Default mappers for common keys.
297
297
_DEFAULT_KEY_MAPPERS : Mapping [str , Tuple [Mapper , ...]] = {
298
298
"dim" : (_get_axis_coord ,),
299
- "dims" : (_get_axis_coord ,), # is this necessary?
299
+ "dims" : (_get_axis_coord ,), # transpose
300
300
"coords" : (_get_axis_coord ,), # interp
301
301
"indexers" : (_get_axis_coord ,), # sel, isel
302
302
"dims_or_levels" : (_get_axis_coord ,), # reset_index
@@ -433,9 +433,11 @@ def _getattr(
433
433
434
434
@functools .wraps (func )
435
435
def wrapper (* args , ** kwargs ):
436
- arguments = accessor ._process_signature (func , args , kwargs , key_mappers )
436
+ posargs , arguments = accessor ._process_signature (
437
+ func , args , kwargs , key_mappers
438
+ )
437
439
final_func = extra_decorator (func ) if extra_decorator else func
438
- result = final_func (** arguments )
440
+ result = final_func (* posargs , * *arguments )
439
441
if wrap_classes and isinstance (result , _WRAPPED_CLASSES ):
440
442
result = _CFWrappedClass (result , accessor )
441
443
@@ -575,25 +577,36 @@ def _process_signature(
575
577
# This assigns indexers_kwargs=dict(T=5).
576
578
# and indexers_kwargs is of kind VAR_KEYWORD
577
579
var_kws = []
580
+ # capture *args, e.g. transpose
581
+ var_args = []
578
582
for param in sig .parameters :
579
583
if sig .parameters [param ].kind is inspect .Parameter .VAR_KEYWORD :
580
584
var_kws .append (param )
585
+ elif sig .parameters [param ].kind is inspect .Parameter .VAR_POSITIONAL :
586
+ var_args .append (param )
581
587
588
+ posargs = []
582
589
if args or kwargs :
583
590
bound = sig .bind (* args , ** kwargs )
584
591
arguments = self ._rewrite_values (
585
592
bound .arguments , key_mappers , tuple (var_kws )
586
593
)
587
- # now unwrap the **indexers_kwargs type arguments
588
- # so that xarray can parse it :)
594
+
595
+ # unwrap the *args type arguments
596
+ for arg in var_args :
597
+ value = arguments .pop (arg , None )
598
+ if value :
599
+ # value should always be Iterable
600
+ posargs .extend (value )
601
+ # now unwrap the **kwargs type arguments
589
602
for kw in var_kws :
590
603
value = arguments .pop (kw , None )
591
604
if value :
592
605
arguments .update (** value )
593
606
else :
594
607
arguments = {}
595
608
596
- return arguments
609
+ return posargs , arguments
597
610
598
611
def _rewrite_values (
599
612
self ,
0 commit comments