@@ -543,21 +543,40 @@ def __deserialize(self, data, klass):
543543 m = re .match (r'List\[(.*)]' , klass )
544544 assert m is not None , "Malformed List type definition"
545545 sub_kls = m .group (1 )
546- return [self .__deserialize (sub_data , sub_kls )
546+ return [self .__deserialize (sub_data , sub_kls )
547547 for sub_data in data ]
548548
549549 elif klass .startswith ('Dict[' ):
550550 m = re .match (r'Dict\[([^,]*), (.*)]' , klass )
551551 assert m is not None , "Malformed Dict type definition"
552552 sub_kls = m .group (2 )
553- return {k : self .__deserialize (v , sub_kls )
553+ return {k : self .__deserialize (v , sub_kls )
554554 for k , v in data .items ()}
555555
556- elif klass .startswith ('typing.Optional[' ):
557- m = re .match (r'typing.Optional\[([a-zA-Z0-9_]+\.)*(.*)]' , klass )
558- assert m is not None , "Malformed Optional type definition"
556+ elif klass .startswith ('typing.List[' ):
557+ m = re .match (r'typing\.List\[(.*)]' , klass )
558+ assert m is not None , "Malformed typing.List type definition"
559+ sub_kls = m .group (1 )
560+ return [self .__deserialize (sub_data , sub_kls ) for sub_data in data ]
561+
562+ elif klass .startswith ('typing.Dict[' ):
563+ m = re .match (r'typing\.Dict\[([^,]*), (.*)]' , klass )
564+ assert m is not None , "Malformed typing.Dict type definition"
559565 sub_kls = m .group (2 )
560- klass = sub_kls
566+ return {k : self .__deserialize (v , sub_kls ) for k , v in data .items ()}
567+
568+ elif klass .startswith ('typing.Optional[' ) or klass .startswith ('Optional[' ):
569+ m = re .match (r'(?:typing\.)?Optional\[(.*)]' , klass )
570+ assert m is not None , "Malformed Optional type definition"
571+ klass = m .group (1 )
572+ continue
573+
574+ elif klass .startswith ('typing.Union[' ) or klass .startswith ('Union[' ):
575+ m = re .match (r'(?:typing\.)?Union\[(.*),\s*NoneType]' , klass )
576+ assert m is not None , "Malformed Union type definition"
577+ klass = m .group (1 )
578+ continue
579+
561580 else :
562581 break
563582
0 commit comments