U .Wv@s\dZddlmZmZmZddlZddlZddlZddlZzddl m Z Wn e k rhddl m Z YnXddl mZdddd gZeejZeejZeeejfZd"d d Zd d Zdd ZGdddeZGdddeZGdddeZedddZedddZ edddZ!edddZ"edddZ#GdddeZ$Gd ddeZ%Gd!ddeZ&dS)#zFunction signature objects for callables Back port of Python 3.3's function signature tools from the inspect module, modified to be compatible with Python 2.6, 2.7 and 3.3+. )absolute_importdivisionprint_functionN) OrderedDict) __version__BoundArguments Parameter Signature signaturecCs8t|tr0|jdd|fkr |jS|jd|jSt|S)NbuiltinsZ __builtin__.) isinstancetype __module____name__repr) annotationZ base_moduler /__init__.pyformatannotations  rcGs\z2|tkrWdSt||}|D]}t|||}qWntk rHYdSXt|tsX|SdSN)rgetattrAttributeErrorr _NonUserDefinedCallables)clsZ method_namenestedZmethnamerrr_get_user_defined_method's  rc Cst|std|t|tjrt|j}|jdkr:|St |j }|r^|dj t tfkrftd|dj }|ttfkr|dd}n|tk rtd|j|dSz |j}Wntk rYnX|dk r|Sz |j}Wntk rYn Xt|St|tjrt|St|tjrt|j}t|j }|jpBd}|j pNi}z|j!||}Wn6tk r} zd |} t| W5d} ~ XYnX|j"D]R\} } || } | |kr| j| d d || <n"| j t tfkr| j#s|$| q|j| dSd}t|t%rtt&t%|d }|dk r8t|}n:t&|d }|dk rVt|}nt&|d}|dk rt|}n.t|t'st&t%|d d}|dk rt|}|dk r|jt |j dddSt|tj(rd|} t| td|dS)z/Get a signature object for the passed callable.z{0!r} is not a callable objectNrzinvalid method signaturezinvalid argument type) parametersrz,partial object {0!r} has incorrect argumentsT)default_partial_kwarg__call____new____init__Zim_funcz-no signature found for builtin function {0!r}z,callable {0!r} is not supported by signature))callable TypeErrorformatr types MethodTyper __func____self__tuplervalueskind _VAR_KEYWORD _KEYWORD_ONLY ValueError_POSITIONAL_OR_KEYWORD_POSITIONAL_ONLY_VAR_POSITIONALreplaceZ __signature__r __wrapped__ FunctionTyper from_function functoolspartialfuncritemsargskeywords bind_partial argumentsr!poprrrBuiltinFunctionType)objZsigparamsr.wrappedZ new_paramsZ partial_argsZpartial_keywordsZbaZexmsgZarg_nameZ arg_valueparamZcallnewZinitrrrr 7s                            c@seZdZdZdS)_voidz0A private marker - used in Parameter & SignatureN)rr __qualname____doc__rrrrrIsrIc@s eZdZdS)_emptyN)rrrJrrrrrLsrLc@s$eZdZddZddZddZdS)_ParameterKindcOstj|f|}|d|_|S)Nr)intr#_name)selfr=kwargsrCrrrr#s z_ParameterKind.__new__cCs|jSrrOrPrrr__str__sz_ParameterKind.__str__cCs d|jS)Nz<_ParameterKind: {0!r}>)r'rOrSrrr__repr__sz_ParameterKind.__repr__N)rrrJr#rTrUrrrrrMsrMPOSITIONAL_ONLYrrPOSITIONAL_OR_KEYWORDVAR_POSITIONAL KEYWORD_ONLY VAR_KEYWORDc@seZdZdZdZeZeZe Z e Z e ZeZeedfddZeddZedd Zed d Zed d ZeeeeefddZddZddZddZddZddZdS)raRepresents a parameter in a function signature. Has the following public attributes: * name : str The name of the parameter as a string. * default : object The default value for the parameter if specified. If the parameter has no default value, this attribute is not set. * annotation The annotation for the parameter if specified. If the parameter has no annotation, this attribute is not set. * kind : str Describes how argument values are bound to the parameter. Possible values: `Parameter.POSITIONAL_ONLY`, `Parameter.POSITIONAL_OR_KEYWORD`, `Parameter.VAR_POSITIONAL`, `Parameter.KEYWORD_ONLY`, `Parameter.VAR_KEYWORD`. )rO_kind_default _annotationr!FcCs|tttttfkrtd||_|tk rF|ttfkrFd|}t|||_ ||_ |dkrr|tkrjtd||_ n8t |}|tkrt d|t jsd|}t|||_ ||_dS)Nz,invalid value for 'Parameter.kind' attributez){0} parameters cannot have default valueszz{0}:{1}z{0}={1}*z**) r.rOr3r'rarLrr`rr4r/)rPr. formattedrrrrT;s"    zParameter.__str__cCsd|jjt||jS)Nz<{0} at {1:#x} {2!r}>)r' __class__ridrrSrrrrUSs zParameter.__repr__cCsd|jj}t|dSNzunhashable type: '{0}'r'rirr&rPrFrrr__hash__WszParameter.__hash__cCs<t|jto:|j|jko:|j|jko:|j|jko:|j|jkSr) issubclassrirrOr_r`rarPotherrrr__eq__[s     zParameter.__eq__cCs || Srrrrprrr__ne__bszParameter.__ne__N)rrrJrK __slots__r3rVr2rXr4rZr0r\r/r^rLemptyr$propertyrr rr.rIr5rTrUrnrrrtrrrrrs8      c@sTeZdZdZddZeddZeddZedd Zd d Z d d Z ddZ dS)raResult of `Signature.bind` call. Holds the mapping of arguments to the function's parameters. Has the following public attributes: * arguments : OrderedDict An ordered mutable mapping of parameters' names to arguments' values. Does not contain arguments' default values. * signature : Signature The Signature object that created this instance. * args : tuple Tuple of positional arguments values. * kwargs : dict Dict of keyword arguments values. cCs||_||_dSr)r@ _signature)rPr r@rrrr$wszBoundArguments.__init__cCs|jSr)rxrSrrrr {szBoundArguments.signaturec Csg}|jjD]j\}}|jttfks,|jr0q|z|j|}Wntk rXYq|YqX|jt krp| |q| |qt |Sr) rxrr<r.r/r0r!r@KeyErrorr4extendappendr,)rPr= param_namerGargrrrr=s    zBoundArguments.argsc Csi}d}|jjD]~\}}|sJ|jttfks4|jr:d}n||jkrJd}q|sPqz|j|}Wntk rrYqX|jtkr| |q|||<q|S)NFT) rxrr<r.r/r0r!r@ryupdate)rPrQZkwargs_startedr|rGr}rrrrQs*    zBoundArguments.kwargscCsd|jj}t|dSrkrlrmrrrrnszBoundArguments.__hash__cCs$t|jto"|j|jko"|j|jkSr)rorirr r@rprrrrrs    zBoundArguments.__eq__cCs || SrrsrprrrrtszBoundArguments.__ne__N) rrrJrKr$rwr r=rQrnrrrtrrrrrfs   c@seZdZdZdZeZeZe Z de dfddZ e ddZ ed d Zed d Zeefd dZddZddZddZdddZddZddZddZdS)r aA Signature object represents the overall signature of a function. It stores a Parameter object for each parameter accepted by the function, as well as information specific to the function itself. A Signature object has the following public attributes and methods: * parameters : OrderedDict An ordered mapping of parameters' names to the corresponding Parameter objects (keyword-only arguments are in the same order as listed in `code.co_varnames`). * return_annotation : object The annotation for the return type of the function if specified. If the function has no annotation for its return type, this attribute is not set. * bind(*args, **kwargs) -> BoundArguments Creates a mapping from positional and keyword arguments to parameters. * bind_partial(*args, **kwargs) -> BoundArguments Creates a partial mapping from positional and keyword arguments to parameters (simulating 'functools.partial' behavior.) )_return_annotation _parametersNTc Cs|dkrt}n|rt}t}t|D]z\}}|j}||krXd} | ||j} t| n|}|j} | dkr~t|} |j| d}| |krd| } t| ||| <q&ntdd|D}||_ ||_ dS)zConstructs Signature from the given list of Parameter objects and 'return_annotation'. All arguments are optional. Nz%wrong parameter order: {0} before {1}rWzduplicate parameter name: {0!r}css|]}|j|fVqdSrrW).0rGrrr sz%Signature.__init__..) rr3 enumerater.r'r1rrbr5rr) rPrreturn_annotation__validate_parameters__rDZtop_kindidxrGr.rFrrrrr$s2    zSignature.__init__c Cst|tjstd||j}|j}|j}|j}t |d|}t |dd}||||}t |di} |j } t |dd} | rt | } nd} g} || }|d|D]$}| |t}| |||tdqt||dD].\}}| |t}| |||t| |dq|jd @rD|||}| |t}| |||td|D]B}t}| dk rf| |t}| |t}| |||t|dqH|jd @r||}|jd @r|d 7}||}| |t}| |||td|| | d td dS)z2Constructs Signature for the given python functionz{0!r} is not a Python functionNco_kwonlyargcountr__annotations____kwdefaults__)rr.)rr.r r]rreturnF)rr)r r(r7r&r'_parameter_cls__code__ co_argcount co_varnamesr,r __defaults__lengetrLr{r2rco_flagsr4r0r/)rr;rZ func_codeZ pos_countZ arg_namesZ positionalZkeyword_only_countZ keyword_onlyZ annotationsdefaultsZ kwdefaultsZpos_default_countrZnon_default_countrroffsetr indexrrrr8 sp                         zSignature.from_functioncCs6zt|jWStk r0t|jYSXdSr)r(MappingProxyTyperrrr<rSrrrrTszSignature.parameterscCs|jSr)rrSrrrr[szSignature.return_annotationcCs0|tkr|j}|tkr |j}t|||dS)zCreates a customized copy of the Signature. Pass 'parameters' and/or 'return_annotation' arguments to override them in the new copy. )r)rIrr-rr)rPrrrrrr5_s zSignature.replacecCsd|jj}t|dSrkrlrmrrrrnnszSignature.__hash__c Cstt|tr.|j|jks.t|jt|jkr2dStddt|jD}t|j D]\}\}}|j t krz|j|}Wnt k rYdSX||krdSq\z ||}Wnt k rYdSX||ks||j|kr\dSq\dS)NFcss|]\}}||fVqdSrr)rrrGrrrrxsz#Signature.__eq__..T) rorr rrrdictrkeysr<r.r0ry)rPrqZother_positionsrr|rGZ other_paramZ other_idxrrrrrrs4       zSignature.__eq__cCs || SrrsrprrrrtszSignature.__ne__Fc Cst}t|j}d}t|}|rP|jD] \}} | jr.||kr.| j||<q.z t|} Wntk r<z t|} Wntk rYYqYnX| j t krYqn| j |kr| j t krd} | j | j d} t| | f}YqnR| j tks| jtk r | f}Yqn.|r| f}Yqnd} | j | j d} t| YqPXz t|} Wntk rhtdYqPX| j ttfkrtd| j t kr| g} | |t| || j <q| j |krtdj | j d| || j <qPd} t||D]} | j t kr tdj | j d| j tkr | } q| j }z||} WnDtk rx|st| j t krt| jtkrttdj |dYn X| ||<q|r| dk r||| j <n td||||S) z$Private method. Don't use directly.rzA{arg!r} parameter is positional only, but was passed as a keyword)r}z'{arg!r} parameter lacking default valueztoo many positional argumentsz$multiple values for argument {arg!r}Nztoo many keyword arguments %r)riterrr-r<r!r next StopIterationr.r4rr3r'r&r/rLr0rzr, itertoolschainrAry_bound_arguments_cls)rPr=rQr:r@rZ parameters_exZarg_valsr|rGZarg_valrFr-Z kwargs_paramrrr_binds                  zSignature._bindcOs|d|dd|S)zGet a BoundArguments object, that maps the passed `args` and `kwargs` to the function's signature. Raises `TypeError` if the passed arguments can not be bound. rrNr)r=rQrrrbindszSignature.bindcOs|j||ddS)zGet a BoundArguments object, that partially maps the passed `args` and `kwargs` to the function's signature. Raises `TypeError` if the passed arguments can not be bound. T)r:r)rPr=rQrrrr?szSignature.bind_partialc Csg}d}t|jD]H\}}t|}|j}|tkr:d}n|tkrT|rT|dd}||qdd |}|j t k rt |j }|d|7}|S)NTFrgz({0})z, z -> {0}) rrr-rbr.r4r0r{r'joinrrLr) rPresultZrender_kw_only_separatorrrGrhr.ZrenderedZannorrrrT!s      zSignature.__str__)F)rrrJrKrurrrrrLrvr$ classmethodr8rwrrrIr5rnrrrtrrr?rTrrrrr s. & H   )N)'rKZ __future__rrrrr9rcr( collectionsr ImportErrorZ ordereddictZfuncsigs.versionr__all__rr"Z_WrapperDescriptorallZ_MethodWrapperrBrrrr objectrIrLrNrMr3r2r4r0r/rrr rrrrsB           a