o 7]hb@sUddlmZmZmZmZddlZddlmZddl m Z m Z e e fZe edfed<eddd DZGd d d ZGd d d ZeeeedS))MutableMappingMappingMutableSequenceIteratorN)ref)TupleAny.str_typeccs|]}|VqdSN).0_r r ?/usr/lib/python3/dist-packages/pip/_vendor/pyparsing/results.py srr c@s2eZdZdgZddZddZddZdd Zd S) _ParseResultsWithOffsettupcCs||f|_dSr r)selfp1p2r r r__init__z _ParseResultsWithOffset.__init__cCs |j|Sr rrir r r __getitem__ z#_ParseResultsWithOffset.__getitem__cCs|jSr rrr r r __getstate__sz$_ParseResultsWithOffset.__getstate__cGs|d|_dSNrr)rargsr r r __setstate__rz$_ParseResultsWithOffset.__setstate__N)__name__ __module__ __qualname__ __slots__rrrr r r r rr s  rc@seZdZUdZdgddfZeedfed<gdZGdd d e Z dYd d Z ddd d e fd dZ ddZe fddZddZdefddZdefddZdefddZdefddZdefddZd d!Zd"d#Zd$d%Zdefd&d'Zd(d)ZdZd*d+Zd,d-Zd.d/Z d0d1Z!d2d3Z"d4d5Z#d[d6d7Z$d[d8d9Z%d[d:d;Z&de'fdd?Z)d\d@dAZ*de fdBdCZ+de,fdDdEZ-d[dFdGZ.dHdIZ/d]de'fdKdLZ0dMdNZ1dOdPZ2dQdRZ3dSdTZ4dUdVZ5e6dZd[dWdXZ7e+Z8e-Z9e/Z:dS)^ ParseResultsaStructured parse results, to provide multiple means of access to the parsed data: - as a list (``len(results)``) - by list index (``results[0], results[1]``, etc.) - by attribute (``results.`` - see :class:`ParserElement.set_results_name`) Example:: integer = Word(nums) date_str = (integer.set_results_name("year") + '/' + integer.set_results_name("month") + '/' + integer.set_results_name("day")) # equivalent form: # date_str = (integer("year") + '/' # + integer("month") + '/' # + integer("day")) # parse_string returns a ParseResults object result = date_str.parse_string("1999/12/31") def test(s, fn=repr): print("{} -> {}".format(s, fn(eval(s)))) test("list(result)") test("result[0]") test("result['month']") test("result.day") test("'month' in result") test("'minutes' in result") test("result.dump()", str) prints:: list(result) -> ['1999', '/', '12', '/', '31'] result[0] -> '1999' result['month'] -> '12' result.day -> '31' 'month' in result -> True 'minutes' in result -> False result.dump() -> ['1999', '/', '12', '/', '31'] - day: 31 - month: 12 - year: 1999 Nr . _null_values)_name_parent _all_names_modal_toklist_tokdict __weakref__c@seZdZdZdddZdS)zParseResults.Lista Simple wrapper class to distinguish parsed list results that should be preserved as actual Python lists, instead of being converted to :class:`ParseResults`: LBRACK, RBRACK = map(pp.Suppress, "[]") element = pp.Forward() item = ppc.integer element_list = LBRACK + pp.delimited_list(element) + RBRACK # add parse actions to convert from ParseResults to actual Python collection types def as_python_list(t): return pp.ParseResults.List(t.as_list()) element_list.add_parse_action(as_python_list) element <<= item | element_list element.run_tests(''' 100 [2,3,4] [[2, 1],3,4] [(2, 1),3,4] (2,3,4) ''', post_parse=lambda s, r: (r[0], type(r[0]))) prints: 100 (100, ) [2,3,4] ([2, 3, 4], ) [[2, 1],3,4] ([[2, 1], 3, 4], ) (Used internally by :class:`Group` when `aslist=True`.) NcCs8|durg}t|tstd|jt|jt|S)Nz.{} may only be constructed with a list, not {}) isinstancelist TypeErrorformatr!type__new__)cls containedr r rr4|s  zParseResults.List.__new__r )r!r"r#__doc__r4r r r rListUs&r8cKst|tr|St|}d|_d|_t|_|durg|_nt|t t fr8t|tj r2|ddgnt ||_n|g|_t |_ |Sr )r/r%objectr4r(r)setr*r,r0_generator_typer8dictr-)r5toklistnamekwargsrr r rr4s   zParseResults.__new__Tc Cs||_|duru|dkrw||trt|}|s|h|_||_||jvry||ttfr,|g}|rP||tr>t t|j d||<n t t|dd||<|||_dSz |d||<WdSt t t fyt||urn|||<YdS||_YdSwdSdSdS)Nr&r)r+intstrr*r(r'r r3r%rr,KeyErrorr1 IndexError)rr=r>asListmodalr/r r rrs8       zParseResults.__init__cCsLt|ttfr |j|S||jvr|j|ddStdd|j|DS)NrcSsg|]}|dqS)rr r vr r r z,ParseResults.__getitem__..)r/r@slicer,r*r-r%rr r rrs   zParseResults.__getitem__cCs||tr|j|t|g|j|<|d}n"||ttfr'||j|<|}n|j|tt|dg|j|<|}||trFt||_ dSdSr) rr-getr0r@rKr,r%wkrefr))rkrHr/subr r r __setitem__s     zParseResults.__setitem__c Cst|ttfrXt|j}|j|=t|tr$|dkr||7}t||d}tt||}||j D]\}}|D]}t |D]\}\}} t || | |k||<qBq occurrencesjrNvaluepositionr r r __delitem__s&     zParseResults.__delitem__returncCs ||jvSr )r-)rrNr r r __contains__rzParseResults.__contains__cC t|jSr )rRr,rr r r__len__rzParseResults.__len__cCs|jp|j Sr )r,r-rr r r__bool__szParseResults.__bool__cCrar iterr,rr r r__iter__rzParseResults.__iter__cCst|jdddS)NrFrdrr r r __reversed__szParseResults.__reversed__cCrar )rer-rr r rkeysrzParseResults.keyscfddDS)Nc3s|]}|VqdSr r r rNrr rrsz&ParseResults.values..rhrr rrvalueszParseResults.valuescri)Nc3s|] }||fVqdSr r rjrr rrsz%ParseResults.items..rkrr rrrVrmzParseResults.itemscCra)z Since ``keys()`` returns an iterator, this method is helpful in bypassing code that looks for the existence of any defined results names.)boolr-rr r rhaskeyss zParseResults.haskeyscOs|sdg}|D]\}}|dkr|d|f}q td|t|dts2t|dks2|d|vr?|d}||}||=|S|d}|S)a Removes and returns item at specified index (default= ``last``). Supports both ``list`` and ``dict`` semantics for ``pop()``. If passed no argument or an integer argument, it will use ``list`` semantics and pop tokens from the list of parsed tokens. If passed a non-integer argument (most likely a string), it will use ``dict`` semantics and pop the corresponding value from any defined results names. A second default return value argument is supported, just as in ``dict.pop()``. Example:: numlist = Word(nums)[...] print(numlist.parse_string("0 123 321")) # -> ['0', '123', '321'] def remove_first(tokens): tokens.pop(0) numlist.add_parse_action(remove_first) print(numlist.parse_string("0 123 321")) # -> ['123', '321'] label = Word(alphas) patt = label("LABEL") + OneOrMore(Word(nums)) print(patt.parse_string("AAB 123 321").dump()) # Use pop() in a parse action to remove named result (note that corresponding value is not # removed from list form of results) def remove_LABEL(tokens): tokens.pop("LABEL") return tokens patt.add_parse_action(remove_LABEL) print(patt.parse_string("AAB 123 321").dump()) prints:: ['AAB', '123', '321'] - LABEL: AAB ['AAB', '123', '321'] rFdefaultrz-pop() got an unexpected keyword argument {!r}rQ)rVr1r2r/r@rR)rrr?rNrHindexret defaultvaluer r rpop s(&zParseResults.popcCs||vr||S|S)a^ Returns named result matching the given key, or if there is no such name, then returns the given ``default_value`` or ``None`` if no ``default_value`` is specified. Similar to ``dict.get()``. Example:: integer = Word(nums) date_str = integer("year") + '/' + integer("month") + '/' + integer("day") result = date_str.parse_string("1999/12/31") print(result.get("year")) # -> '1999' print(result.get("hour", "not specified")) # -> 'not specified' print(result.get("hour")) # -> None r )rkey default_valuer r rrLFszParseResults.getcCsR|j|||jD]\}}t|D]\}\}}t||||k||<qq dS)a; Inserts new element at location index in the list of parsed tokens. Similar to ``list.insert()``. Example:: numlist = Word(nums)[...] print(numlist.parse_string("0 123 321")) # -> ['0', '123', '321'] # use a parse action to insert the parse location in the front of the parsed results def insert_locn(locn, tokens): tokens.insert(0, locn) numlist.add_parse_action(insert_locn) print(numlist.parse_string("0 123 321")) # -> [0, '0', '123', '321'] N)r,insertr-rVrWr)rrq ins_stringr>rZrNr\r]r r rrw]s  zParseResults.insertcCs|j|dS)a Add single element to end of ``ParseResults`` list of elements. Example:: numlist = Word(nums)[...] print(numlist.parse_string("0 123 321")) # -> ['0', '123', '321'] # use a parse action to compute the sum of the parsed integers, and add it to the end def append_sum(tokens): tokens.append(sum(map(int, tokens))) numlist.add_parse_action(append_sum) print(numlist.parse_string("0 123 321")) # -> ['0', '123', '321', 444] N)r,append)ritemr r rryvszParseResults.appendcCs(t|tr ||dS|j|dS)a! Add sequence of elements to end of ``ParseResults`` list of elements. Example:: patt = OneOrMore(Word(alphas)) # use a parse action to append the reverse of the matched strings, to make a palindrome def make_palindrome(tokens): tokens.extend(reversed([t[::-1] for t in tokens])) return ''.join(tokens) patt.add_parse_action(make_palindrome) print(patt.parse_string("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' N)r/r%__iadd__r,extend)ritemseqr r rr|s zParseResults.extendcCs|jdd=|jdS)z7 Clear all elements and results names. N)r,r-clearrr r rr~s zParseResults.clearcCs2z||WSty|drt|YdSw)N__r&)rB startswithAttributeError)rr>r r r __getattr__s   zParseResults.__getattr__cCs|}||7}|Sr )copy)rotherrrr r r__add__szParseResults.__add__cs|jr5t|jfdd|j}fdd|D}|D]\}}|||<t|dtr4t||d_q|j|j7_|j|jO_|S)Ncs|dkrS|Srr )a)offsetr rrJz'ParseResults.__iadd__..c s4g|]\}}|D]}|t|d|dfqqS)rrQ)r)r rNvlistrH) addoffsetr rrIsz)ParseResults.__iadd__..r) r-rRr,rVr/r%rMr)r*)rr otheritemsotherdictitemsrNrHr )rrrr{s     zParseResults.__iadd__cCs"t|tr |dkr |S||Sr)r/r@r)rrr r r__radd__szParseResults.__radd__cCsdt|j|j|S)Nz {}({!r}, {}))r2r3r!r,as_dictrr r r__repr__szParseResults.__repr__cCsdddd|jDdS)N[z, cSs&g|]}t|tr t|nt|qSr )r/r%rArepr)r rr r rrIsz(ParseResults.__str__..])joinr,rr r r__str__szParseResults.__str__cCsLg}|jD]}|r|r||t|tr||7}q|t|q|Sr )r,ryr/r% _asStringListrA)rsepoutrzr r rrs   zParseResults._asStringListcCsdd|jDS)a{ Returns the parse results as a nested list of matching tokens, all converted to strings. Example:: patt = OneOrMore(Word(alphas)) result = patt.parse_string("sldkj lsdkj sldkj") # even though the result prints in string-like form, it is actually a pyparsing ParseResults print(type(result), result) # -> ['sldkj', 'lsdkj', 'sldkj'] # Use as_list() to create an actual list result_list = result.as_list() print(type(result_list), result_list) # -> ['sldkj', 'lsdkj', 'sldkj'] cSs"g|] }t|tr |n|qSr )r/r%as_list)r resr r rrIsz(ParseResults.as_list..)r,rr r rrszParseResults.as_listcs&fddtfdd|DS)a Returns the named parse results as a nested dictionary. Example:: integer = Word(nums) date_str = integer("year") + '/' + integer("month") + '/' + integer("day") result = date_str.parse_string('12/31/1999') print(type(result), repr(result)) # -> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) result_dict = result.as_dict() print(type(result_dict), repr(result_dict)) # -> {'day': '1999', 'year': '12', 'month': '31'} # even though a ParseResults supports dict-like access, sometime you just need to have a dict import json print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable print(json.dumps(result.as_dict())) # -> {"month": "31", "day": "1999", "year": "12"} cs0t|tr|r |Sfdd|DS|S)Ncsg|]}|qSr r rGto_itemr rrIrJz9ParseResults.as_dict..to_item..)r/r%rorobjrr rr s "z%ParseResults.as_dict..to_itemc3s |] \}}||fVqdSr r r rNrHrr rrz'ParseResults.as_dict..)r<rVrr rrrs zParseResults.as_dictcCs:t|j}|j|_|j|_|j|jO_|j|_|S)zG Returns a new copy of a :class:`ParseResults` object. )r%r,r-rr)r*r()rrrr r rrs  zParseResults.copycs|jr|jS|jr|fdd}r||SdSt|dkr@t|jdkr@tt|jdddvr@tt|jSdS)a Returns the results name for this token expression. Useful when several different expressions might match at a particular location. Example:: integer = Word(nums) ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d") house_number_expr = Suppress('#') + Word(nums, alphanums) user_data = (Group(house_number_expr)("house_number") | Group(ssn_expr)("ssn") | Group(integer)("age")) user_info = OneOrMore(user_data) result = user_info.parse_string("22 111-22-3333 #221B") for item in result: print(item.get_name(), ':', item[0]) prints:: age : 22 ssn : 111-22-3333 house_number : 221B cstfddjDdS)Nc3s.|]\}}|D] \}}|ur|VqqdSr r )r rNrrHlocrOr rr@sz@ParseResults.get_name..find_in_parent..)nextr-rVrparrrfind_in_parent>s  z-ParseResults.get_name..find_in_parentNrQr)rrF)r(r)rRr-rrerlrh)rrr rrget_name s  zParseResults.get_namerc Csfg}d}||r|t|nd|r|rctdd|D}|D]<\}} |r1|||d|d||t| tr[| rS|| j ||||ddq&|t| q&|t | q&t d d|Dr|} t | D];\} } t| tr|d |d|| |d|d| j ||||ddqr|d |d|| |d|dt| fqrd |S) aG Diagnostic method for listing out the contents of a :class:`ParseResults`. Accepts an optional ``indent`` argument so that this string can be embedded in a nested display of other data. Example:: integer = Word(nums) date_str = integer("year") + '/' + integer("month") + '/' + integer("day") result = date_str.parse_string('12/31/1999') print(result.dump()) prints:: ['12', '/', '31', '/', '1999'] - day: 1999 - month: 31 - year: 12  r&css |] \}}t||fVqdSr )rArr r rrnrz$ParseResults.dump..z {}{}- {}: z rQ)indentfull include_list_depthcss|]}t|tVqdSr )r/r%)r vvr r rrsz {}{}[{}]: {}{}{}z %s%s[%d]: %s%s%s)ryrArrosortedrVr2r/r%dumpranyrWr) rrrrrrNLrVrNrHrrr r rrSsj        zParseResults.dumpcOs tj|g|Ri|dS)a% Pretty-printer for parsed results as a list, using the `pprint `_ module. Accepts additional positional or keyword args as defined for `pprint.pprint `_ . Example:: ident = Word(alphas, alphanums) num = Word(nums) func = Forward() term = ident | num | Group('(' + func + ')') func <<= ident + Group(Optional(delimited_list(term))) result = func.parse_string("fna a,b,(fnb c,d,200),100") result.pprint(width=40) prints:: ['fna', ['a', 'b', ['(', 'fnb', ['c', 'd', '200'], ')'], '100']] N)pprintr)rrr?r r rrs zParseResults.pprintcCs.|j|j|jdur|pd|j|jffSr )r,r-rr)r*r(rr r rrszParseResults.__getstate__cCs@|\|_\|_}}|_t||_|durt||_dSd|_dSr )r,r-r(r:r*rMr))rstater inAccumNamesr r rr s   zParseResults.__setstate__cCs |j|jfSr )r,r(rr r r__getnewargs__s zParseResults.__getnewargs__cCstt|t|Sr )dirr3r0rhrr r r__dir__szParseResults.__dir__cCsrdd}|g}|D]\}}t|tr||j||d7}q |||g|||d7}q |dur7||g|d}|S)z Helper classmethod to construct a ``ParseResults`` from a ``dict``, preserving the name-value relations as results names. If an optional ``name`` argument is given, a nested ``ParseResults`` will be returned. cSs.zt|Wn tyYdSwt|t S)NF)re Exceptionr/r rr r r is_iterables    z+ParseResults.from_dict..is_iterable)r>)r>rDN)rVr/r from_dict)r5rr>rrrrNrHr r rrs zParseResults.from_dict)NNr )r_r%)r&)r&TTr);r!r"r#r7r'rr__annotations__r$r0r8r4r/rrrPr^rnr`r@rbrcrrfrgrhrlrVrortrLrwryr|r~rrr{rrArrrrr<rrrrrrr rr classmethodrrDasDictgetNamer r r rr%s` - 3    :       3P r%)collections.abcrrrrrweakrefrrMtypingrrrAbytesr r3rr;rr%registerr r r rs  a