From 508655089f8d656e5e4c5a8444252ca0505fdc20 Mon Sep 17 00:00:00 2001 From: codeboss <2422523675@qq.com> Date: Sun, 4 Aug 2024 10:00:45 +0800 Subject: [PATCH] update-type-hint --- .../__pycache__/CompareViews.cpython-312.pyc | Bin 10559 -> 10556 bytes frame/__pycache__/ReferView.cpython-312.pyc | Bin 4601 -> 4620 bytes .../__pycache__/DAGLayout.cpython-312.pyc | Bin 14327 -> 14327 bytes parse/StoryMap.py | 78 +++++++++--------- parse/__pycache__/StoryMap.cpython-312.pyc | Bin 11712 -> 22322 bytes 5 files changed, 39 insertions(+), 39 deletions(-) diff --git a/frame/__pycache__/CompareViews.cpython-312.pyc b/frame/__pycache__/CompareViews.cpython-312.pyc index 3e16a489289be49c02d9e4c0a87a561597414341..1ebb3392c8087a6ef04412aa68df9b3b72d8dd27 100644 GIT binary patch delta 1366 zcma)4TTdHT5T3KUzOB7x!RF!%U?+yyKtfZ9MDtb!6_rX63ZWIJa$Lfm0M4G68mh(# z)U-;aM2b|%MoCjeEm9v*Ln1$vq)6c*Z&BN|QUvNnps0rSsV?LP^mxrBR8;DDn3?Z8 zGvCbY*~h2mPf1TDNd$H>AANIfaZ2)}tvtYOPymC16i!7L8J@!&^SsJa0SnZGP1KCd zsE{M57HY*-BQ~ivDq@k^vE9IC)j=gJQ73lN5?n%MEYnh4O3QE=0)pc8h1Pq{)YFO{ zZXX`vjeGJ8K>mMbh2}uMG*T>TC9T3$)Pp_7gjUr{eb`6+*l%E)T1{(k4XwqsG=Kv% zh=T?%st4#ne2|842muEjpxCc~;vgk6?0Xdst}|GPu}&iGu=V7SQgS{FkbJ^{nUu1n zyR^Q5OY5q(wBZN`q->@r0Jwpn0P)SBB7qwX?BBsn3r> zw(d4!8I-N#W&aY1#1n<^Jp?H(#YN-~x>>DwB0-1ylH~0n^5Mu|^IwR$*@tVhH@im@ z$&@;DfsEw7dbIxNaqho&rmWr8I_&)_y zp7B~^0;ZL04azFCzFL&NWRX@8xcXf=DC@kVDZTN%uK*?WoQFzw$iH|zsuF1 z4@~#ni9eGgzy2#8dM1bS7QyAbdLl1^$G-tc3Qr2lvU^DmWaYqg`J#L%&ogq>A%E6+ zt#io{$T|YkuAdxr%MLm3Vjc2sut~`X>#E)JjvsdyW_Zrb71-b`CMjQ5Ws>f<&$;FX z=c==<9eH3_@9EX?Iek#o>80%8WgTD6_Ka!77jN&4>Sy|OWk4TNbw$mdq1oOGn^0nE z$se#Yozru53;aU&g7sl@_E={g7^lC3i$2!BS-^R3#^qOdG?lqns|)Ds%$uQ45t`I~ ztc!|mKU-okCD9*?We(RbqE{cVISa2ha*SEFCqjR7JQ6lVK=xn2wgRCngnon23cR)g cXP4mYs@4!b?o1(MoAkbbf`4&QONPJy2ghPR2mk;8 delta 1225 zcmah`O>7fK6n?Wmc5HV2lZ5!MPE2AGJ634GL8V-apyU8bFv5%)A|)O|*E?zoQ7h9# zDJl`EplYH)0&$`zkir49mqbEJ4%|?s-4ci|D3lww72%4+>^crXYQ-Ghd*3(n&G+Wb z87 zCB2FIu#ft&-^H@Niz-;5DpqL#2WSunX$XgC7>5xM(9-NtvL({(n18wms_!k_YZX71 zXg3R?#0-=@dK-=42#w;X>*Lj9G>+pmffFun(!ZcdoTTlzop#_3n!+iU_vw3RC+?(O zxC?;*$Dr)L3gulSu*hHRESz>(g|jMAw%H8XTMksR02iMK;2|O2`U$p>j32^T0Z4eU zE(V3LYJjW^0qm>-7ANRU2Ux!(|kME3ZU9}^T-iDsfEU%5Qqe8pR zm0jDmeWXtt+o9Mh$v!R>>Hr_$iVSBCklgmO3M8j}{~x--4#S*QVS|CV#J#i37TP^k zR7JUlog3l_2 z#@R-8G`z(Y@WQk_C2KNEwY9Q*EX?+Jy4gglivD0f##%h`#pB$O&BkudRC#gfHy(b4 zS|t4zyuR?Q!s}vU&EhRs4mWOlU_+-_gt3^YfSTJlY~cXafQpkhUQG64D#+^#+Wt!)T3lXAcK{ SM#wiGe+N!}H_3j;{`~>(R}!uO diff --git a/frame/__pycache__/ReferView.cpython-312.pyc b/frame/__pycache__/ReferView.cpython-312.pyc index 400ce766a02411ea82dd08c3efa8ccd3db0ecf35..71337d0125f873db20cf611476c47ea8e12221ef 100644 GIT binary patch delta 973 zcmZ`%zmF0@6rNpR`LXP>d-6j#PC4K>P*5YHg%@Hx<29F)ODqh)Ga(j90gQkTD z|32-#y1Uial2X0Dyt>;BH^UOKiS6rXO-&|i#8#dV+dq&omyo6|xB%yZQ!XO75a(1X z)5yR($u$HY=DbGrfoH;+bk5fA6$xQ$GNC@IwF~12$NrDGN|dv_lA41F{pa5HO?6^4 z)~>)?HKj;|M%!m`3tQ4{QyzKOw;gvBXt18!yVL6o-%EZ;GT@{9G--0teVIl1!V(-D zG?vM*7%})&;&rhyQ&CMgH7*?IO?%u92|)Q*THih6yF6e zX2Ci6Vor5h52)q#tS;@ce-;$rx$pc{EGWrL=gUS(VQG|FKsbRAM93pxzgPz0@OD`| zW=b+tRuyr*GNeLZrTFk5v?NulJUH?@)V)a`x~zh!!ha2S zXAq9M+YImURvmv0}AidR#i#O|dgl)R5(SiT^j@#`YP>oUxhRV}SR7mYBJT5*wCBQ{X)6+Zw4}Di@65jb1 z^A-lP0`>_{;yHm}NPv`oRh6Uxw*OTM_4p|PE)^hj@Lq&OV8M@Bu%etR>h9KEW_LSw zo3;5r3rg@hFn0wDstPy7XT7TO97^R8P9ua6iU=iyGYG$5SHNolGU}rDxD|soYis9@)RO{IYEq>HXCv-qG_YRPCcVmD*HH4mhRYZ&!(n9BGhBw0 zbwkD8-K212<>0ZEPst`t{<8&dt-4o~g0EI7EweJBa=Z+vorQ9=cF}v_iD67(#&}OA zhp~*&Wq2MfC*_3jJ_y=&TeQWtt7&*2-N+4m?tRzWDmgr9NLJ?HLaea#_ke!{FSR?) lZi}t(YeEf|&3z)^$VVytLK+98F(m0BnGy&uV_ms@zW~$ft-1gJ diff --git a/graph/directed_acyclic_graph/__pycache__/DAGLayout.cpython-312.pyc b/graph/directed_acyclic_graph/__pycache__/DAGLayout.cpython-312.pyc index 505196227610d4241f5ef29eae37554f713fdfec..12cb3ea4a5be2f039a41e500b0ae6587bdd2fc34 100644 GIT binary patch delta 410 zcmeyK|2?1kG%qg~0}!n2T04>3o|};&g&~DGhb@;qYGPglAM~E zGdYr3b#pJX3!5k_&|^iSAVL~MD1Zp|&CfX9wM5xLY&H<#4iRCOM2| zeCb7r1sQrSi6x04l?ACqU{gR!Z?TnB7G&n77lAdifwh2yS#lFgGA2JUozJCypF!m! OgUWpd>CL@nS&RU!lu17T diff --git a/parse/StoryMap.py b/parse/StoryMap.py index 47bdd99..ab7d209 100644 --- a/parse/StoryMap.py +++ b/parse/StoryMap.py @@ -1,5 +1,5 @@ import xml.dom.minidom as mdom -from typing import List, Tuple, Dict +from typing import List, Tuple, Dict, Union from abc import abstractmethod from enum import Enum from frame.ReferView import EmptyNode @@ -20,23 +20,23 @@ class ElementSlice: raise NotImplementedError("type") @abstractmethod - def parent_slice(self) -> 'ElementSlice' | None: + def parent_slice(self) -> Union['ElementSlice', None]: raise NotImplementedError() @abstractmethod - def set_prev(self, inst: 'ElementSlice' | None): + def set_prev(self, inst: Union['ElementSlice', None]): raise NotImplementedError() @abstractmethod - def prev_sibling(self) -> 'ElementSlice' | None: + def prev_sibling(self) -> Union['ElementSlice', None]: raise NotImplementedError() @abstractmethod - def set_next(self, inst: 'ElementSlice' | None): + def set_next(self, inst: Union['ElementSlice', None]): raise NotImplementedError() @abstractmethod - def next_sibling(self) -> 'ElementSlice' | None: + def next_sibling(self) -> Union['ElementSlice', None]: raise NotImplementedError() @abstractmethod @@ -52,23 +52,23 @@ class Collection: class SiblingsImpl(ElementSlice): def __init__(self): - self.__prev_sib: 'StoryDefine' | None = None - self.__next_sib: 'StoryDefine' | None = None + self.__prev_sib: Union['StoryDefine', None] = None + self.__next_sib: Union['StoryDefine', None] = None pass - def parent_slice(self) -> 'ElementSlice' | None: + def parent_slice(self) -> Union['ElementSlice', None]: pass - def set_prev(self, inst: 'ElementSlice' | None): + def set_prev(self, inst: Union['ElementSlice', None]): pass - def prev_sibling(self) -> 'ElementSlice' | None: + def prev_sibling(self) -> Union['ElementSlice', None]: pass - def set_next(self, inst: 'ElementSlice' | None): + def set_next(self, inst: Union['ElementSlice', None]): pass - def next_sibling(self) -> 'ElementSlice' | None: + def next_sibling(self) -> Union['ElementSlice', None]: pass def index(self) -> int: @@ -79,30 +79,30 @@ class StoryDefine(ElementSlice, Collection): def __init__(self, nm: str, idx: int): self.__index = idx self.__name = nm - self.__prev_sib: 'StoryDefine' | None = None - self.__next_sib: 'StoryDefine' | None = None + self.__prev_sib: Union['StoryDefine', None] = None + self.__next_sib: Union['StoryDefine', None] = None self.__children: List[ElementSlice] = [] pass def type(self) -> SliceType: return SliceType.StoryDefine - def parent_slice(self) -> 'ElementSlice' | None: + def parent_slice(self) -> Union['ElementSlice', None]: return None - def set_prev(self, inst: 'ElementSlice' | None): + def set_prev(self, inst: Union['ElementSlice', None]): self.__prev_sib = inst pass - def prev_sibling(self) -> 'ElementSlice' | None: + def prev_sibling(self) -> Union['ElementSlice', None]: return self.__prev_sib pass - def set_next(self, inst: 'ElementSlice' | None): + def set_next(self, inst: Union['ElementSlice', None]): self.__next_sib = inst pass - def next_sibling(self) -> 'ElementSlice' | None: + def next_sibling(self) -> Union['ElementSlice', None]: return self.__next_sib pass @@ -131,30 +131,30 @@ def calc_index(inst: ElementSlice) -> int: class TextParagraph(ElementSlice): def __init__(self, parent: ElementSlice): self.__parent_node = parent - self.__prev_node: ElementSlice | None = None - self.__next_node: ElementSlice | None = None + self.__prev_node: Union[ElementSlice, None] = None + self.__next_node: Union[ElementSlice, None] = None self.__text_lines: List[str] = [] pass def type(self) -> SliceType: return SliceType.TextParagraph - def parent_slice(self) -> 'ElementSlice' | None: + def parent_slice(self) -> Union['ElementSlice', None]: return self.__parent_node - def set_prev(self, inst: 'ElementSlice' | None): + def set_prev(self, inst: Union['ElementSlice', None]): self.__prev_node = inst pass - def prev_sibling(self) -> 'ElementSlice' | None: + def prev_sibling(self) -> Union['ElementSlice', None]: return self.__prev_node - def set_next(self, inst: 'ElementSlice' | None): + def set_next(self, inst: Union['ElementSlice', None]): self.__next_node = inst inst.set_prev(self) pass - def next_sibling(self) -> 'ElementSlice' | None: + def next_sibling(self) -> Union['ElementSlice', None]: return self.__next_node def index(self) -> int: @@ -165,8 +165,8 @@ class FragmentDefine(ElementSlice): def __init__(self, nm:str, parent: ElementSlice): self.__name = nm self.__parent_inst = parent - self.__prev_node: ElementSlice | None = None - self.__next_node: ElementSlice | None = None + self.__prev_node: Union[ElementSlice, None] = None + self.__next_node: Union[ElementSlice, None] = None self.__refer_nodes: List[ElementSlice] = [] self.__description: TextParagraph = TextParagraph(self) pass @@ -174,22 +174,22 @@ class FragmentDefine(ElementSlice): def type(self) -> SliceType: return SliceType.FragmentDefine - def parent_slice(self) -> 'ElementSlice' | None: + def parent_slice(self) -> Union['ElementSlice', None]: return self.__parent_inst - def set_prev(self, inst: 'ElementSlice' | None): + def set_prev(self, inst: Union['ElementSlice', None]): self.__prev_node = inst pass - def prev_sibling(self) -> 'ElementSlice' | None: + def prev_sibling(self) -> Union['ElementSlice', None]: return self.__prev_node - def set_next(self, inst: 'ElementSlice' | None): + def set_next(self, inst: Union['ElementSlice', None]): self.__next_node = inst inst.set_prev(self) pass - def next_sibling(self) -> 'ElementSlice' | None: + def next_sibling(self) -> Union['ElementSlice', None]: return self.__next_node def index(self) -> int: @@ -210,7 +210,7 @@ class FragmentDefine(ElementSlice): class FragmentRefer(ElementSlice): def __init__(self, parent: ElementSlice): - + pass class FragmentSlice(EmptyNode): @@ -221,8 +221,8 @@ class FragmentSlice(EmptyNode): self.fragm_refer = "" self.fragm_sort_i = 0 - self.prev_node: 'FragmentSlice' | None = None # 上游节点 - self.next_node: 'FragmentSlice' | None = None # 下游节点 + self.prev_node: Union['FragmentSlice', None] = None # 上游节点 + self.next_node: Union['FragmentSlice', None] = None # 下游节点 self.refers_slice: Dict[str, 'FragmentSlice'] = {} # 引用切面 self.text_sections: List[str] = [] # 文本段落 @@ -272,7 +272,7 @@ class StoryMap: self.slice_list.append(node) pass - def get_fragment_defined(self, name: str) -> FragmentSlice | None: + def get_fragment_defined(self, name: str) -> Union[FragmentSlice, None]: for fit in self.slice_list: if fit.is_define_node[0]: if fit.is_define_node[1] == name: @@ -305,7 +305,7 @@ class XAST_ParseTool: pass return values - def __extract_empty_storymap(self, name: str) -> Tuple[StoryMap, mdom.Element] | None: + def __extract_empty_storymap(self, name: str) -> Union[Tuple[StoryMap, mdom.Element], None]: storys = self.dom_tree.getElementsByTagName("story") for node in storys: if node.getAttribute("name") == name: diff --git a/parse/__pycache__/StoryMap.cpython-312.pyc b/parse/__pycache__/StoryMap.cpython-312.pyc index 79fbc5c31d344de7dbd55fce1258d8636679f9ca..bc01619d2295622b1c3e2c55c715a9d96756a326 100644 GIT binary patch literal 22322 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 ZgB1?JmE84R?+DjFr`(4s@Xl88{{Va5_Y(jB delta 3165 zcmZ`*YitzP6~6P>-P!ee{o3_oYqeaV+8GwNL72zo!zC7 zW~Ke+-ZSUid(J)IJ!jr~N4Ry^_q+Uj4}ss@U$4*Jsk-DV7vCnAwrp7vh(%3Q*DV zb(ikby|W_DW@XLy;zoJ8U{O#DzQz?sRmqY^VuoosCQhW|x+M?9W=!^XA;{#~qlzUb zqX~URV$l-+$_uqcLb)XydVH3;!Ioll2D%&yh1dhJ*<&e@NGusMBN6uQ)^fqce!I1E zb8W+U`GRjP^XTk8FaJTQ_;O1vK7(tD_dYB@*a5kU_16uT1YmMipr!CI1b`4NW0&h% zg#f!<7ZNJiy}GHVD^W+Z97Z}GGby(axdp93Gd!9Q+NJ6n!Q##O>H-XYR22uQ7Y3@r zek5*gl8>iSaZ55xO3Oh?Hy~^QxJoGM(=r4l3r<$p(C*|f6c&*xR`dq1umd+&C42K0 zRBZ*wo{7BzE`BNyre&8grcJ{Y1oC}LKRClw{PIy;dBQ6xt}95y5CJ$x}&mTRs{0P z(@ss$CAb0(&3VejiRuEWYtgAHmNIUFi~FK!>fy0Aw0ts-X|X(dB5f{4=Jlw?BeXmQ z9&aQLd{#4z;2g~|0*rVNr;4&m=2FoN6l@*vpwmG5l%})(%2M`z>$f|0qE!jP4g?=U zF@Pn-^&~CAku#c3>q#xU=Pr=tj-TCa>lV8Rdt%#>Y^Kj_d$sMVG)mE}uaV?n$al%d zafVIkxFyZT%!h1Z-R+%Xm@u<_bRRmZDnFbi&f7hpME4;)maATrAvD3?Xkq@2+R`U) znybyb9uSwqZ!-(u&s-`B2yHCY(NVYHhxuc_Tv>5Kw(_7@DVn0Y7yLi(3>3IQ@Umm*5{@m*+&Y8)YACyWL11mQ=y9D7G_D$Ehu_4e_9rk@b0AtI61< zWWsWsj3o`zKn6p>!wLfHV9%FEQ= ze;hlKok3krQB!sDh3QcgM-VWHmJ~~xv>!&<(9j8b3<0@nDNqF>NczWuv&vahcR9P* zr;5i3`=HOL<-2nm0onrCW`9l?;QanKKXP_uK8G8vt090BWgm0UVwLYEsn4=;aZh5y8wlS z09Ia7|FJn9J06cE=im&md+^BUJX;NK70TGZ!~K3{iY969M+_K!Ck5@KohlP&aUO2xDW- zTXk3J&b!xqWy@`!`l{I%17k(YZJ+t7*L~SA=rPu}JLS46Km(*v_N(2EL4H2RU_Z-RPG&*NkGCnxLzkkDS441Qekei!?Rqi)k{D!?oR$kwKK^W%O!xgo^ z9Vil*FG9ITzpyvs^x_vDo2~5!My7i0B)o=FIP>J#0tEM`u^#aw!paWbS;C!0)v_P% zA;=1P2th``QbG>`SguUbqEje(7J>Jh6ppYy@|4ljIC=?zd$x?D3ka_uR6o{}_M;F1 zxn}&6u#4l3`JJ~WK7Q`Q=WcHwTite$-5I}D@4p#e?HayMiX0W|n~1}0_bRl@aD(3- z8U(?Nz|Ic(*>5JccXEmeHaR7F9kpeunyAPf0l(c!kQ*K`9)9*S#mNY z9Ap