@@ -1594,27 +1594,40 @@ def param(func):
15941594# python_has_signature = ver_info.major > 2 and ver_info.minor > 2
15951595python_has_wrapped = ver_info [0 ]> 2 and ver_info [1 ]> 1
15961596# python_has_wrapped = ver_info.major > 2 and ver_info.minor > 1
1597+ if not python_has_signature :
1598+ try :
1599+ import IPython .utils .signatures
1600+ signature = IPython .utils .signatures .signature
1601+ Parameter = IPython .utils .signatures .Parameter
1602+ except ImportError :
1603+ pass
1604+ else :
1605+ python_has_signature = True
1606+ else :
1607+ signature = inspect .signature
1608+ Parameter = inspect .Parameter
1609+
15971610if not python_has_signature :
15981611arg_spec = inspect .getargspec (func )
15991612_arg_names = arg_spec .args
16001613_has_no_varargs = arg_spec .varargs is None
16011614_has_varkwargs = arg_spec .keywords is not None
16021615else :
1603- sig = inspect . signature (func )
1616+ sig = signature (func )
16041617_has_no_varargs = True
16051618_has_varkwargs = False
16061619_arg_names = []
16071620params = list (sig .parameters .values ())
16081621for p in params :
1609- if p .kind is p .VAR_POSITIONAL :
1622+ if p .kind is Parameter .VAR_POSITIONAL :
16101623_has_no_varargs = False
1611- elif p .kind is p .VAR_KEYWORD :
1624+ elif p .kind is Parameter .VAR_KEYWORD :
16121625_has_varkwargs = True
16131626else :
16141627_arg_names .append (p .name )
1615- data_param = inspect . Parameter ('data' ,
1616- inspect . Parameter .KEYWORD_ONLY ,
1617- default = None )
1628+ data_param = Parameter ('data' ,
1629+ Parameter .KEYWORD_ONLY ,
1630+ default = None )
16181631if _has_varkwargs :
16191632params .insert (- 1 ,data_param )
16201633else :