@@ -71,13 +71,13 @@ impl<'p, 'a> Serialize for SerializePyObject<'p, 'a> {
7171 {
7272 let obj_ptr = self . obj . get_type_ptr ( ) ;
7373 if obj_ptr == self . refs . str {
74- let val: & PyUnicode = self . obj . extract ( ) . unwrap ( ) ;
74+ let val = unsafe { < PyUnicode as PyTryFrom > :: try_from_unchecked ( self . obj ) } ;
7575 serializer. serialize_str ( unsafe { std:: str:: from_utf8_unchecked ( val. as_bytes ( ) ) } )
7676 } else if obj_ptr == self . refs . bytes {
77- let val: & PyBytes = self . obj . extract ( ) . unwrap ( ) ;
77+ let val = unsafe { < PyBytes as PyTryFrom > :: try_from_unchecked ( self . obj ) } ;
7878 serializer. serialize_str ( unsafe { std:: str:: from_utf8_unchecked ( val. as_bytes ( ) ) } )
7979 } else if obj_ptr == self . refs . dict {
80- let val: & PyDict = self . obj . extract ( ) . unwrap ( ) ;
80+ let val = unsafe { < PyDict as PyTryFrom > :: try_from_unchecked ( self . obj ) } ;
8181 let len = val. len ( ) ;
8282 if len != 0 {
8383 let mut map = serializer. serialize_map ( Some ( len) ) ?;
@@ -88,9 +88,12 @@ impl<'p, 'a> Serialize for SerializePyObject<'p, 'a> {
8888 key
8989 ) ) ) ;
9090 }
91- let keystr: & PyUnicode = key. extract ( ) . unwrap ( ) ;
9291 map. serialize_entry (
93- unsafe { std:: str:: from_utf8_unchecked ( keystr. as_bytes ( ) ) } ,
92+ unsafe {
93+ std:: str:: from_utf8_unchecked (
94+ <PyUnicode as PyTryFrom >:: try_from_unchecked ( key) . as_bytes ( ) ,
95+ )
96+ } ,
9497 & SerializePyObject {
9598 py : self . py ,
9699 refs : self . refs ,
@@ -103,7 +106,7 @@ impl<'p, 'a> Serialize for SerializePyObject<'p, 'a> {
103106 serializer. serialize_map ( None ) . unwrap ( ) . end ( )
104107 }
105108 } else if obj_ptr == self . refs . list {
106- let val: & PyList = self . obj . extract ( ) . unwrap ( ) ;
109+ let val = unsafe { < PyList as PyTryFrom > :: try_from_unchecked ( self . obj ) } ;
107110 let len = val. len ( ) ;
108111 if len != 0 {
109112 let mut seq = serializer. serialize_seq ( Some ( len) ) ?;
@@ -119,7 +122,7 @@ impl<'p, 'a> Serialize for SerializePyObject<'p, 'a> {
119122 serializer. serialize_seq ( None ) . unwrap ( ) . end ( )
120123 }
121124 } else if obj_ptr == self . refs . tuple {
122- let val: & PyTuple = self . obj . extract ( ) . unwrap ( ) ;
125+ let val = unsafe { < PyTuple as PyTryFrom > :: try_from_unchecked ( self . obj ) } ;
123126 let len = val. len ( ) ;
124127 if len != 0 {
125128 let mut seq = serializer. serialize_seq ( Some ( len) ) ?;
@@ -135,7 +138,7 @@ impl<'p, 'a> Serialize for SerializePyObject<'p, 'a> {
135138 serializer. serialize_seq ( None ) . unwrap ( ) . end ( )
136139 }
137140 } else if obj_ptr == self . refs . bool {
138- let val: & PyBool = self . obj . extract ( ) . unwrap ( ) ;
141+ let val = unsafe { < PyBool as PyTryFrom > :: try_from_unchecked ( self . obj ) } ;
139142 serializer. serialize_bool ( val. is_true ( ) )
140143 } else if obj_ptr == self . refs . int {
141144 if let Ok ( val) = <i64 as FromPyObject >:: extract ( self . obj ) {
@@ -147,7 +150,7 @@ impl<'p, 'a> Serialize for SerializePyObject<'p, 'a> {
147150 ) ) )
148151 }
149152 } else if obj_ptr == self . refs . float {
150- let val: & PyFloat = self . obj . extract ( ) . unwrap ( ) ;
153+ let val = unsafe { < PyFloat as PyTryFrom > :: try_from_unchecked ( self . obj ) } ;
151154 serializer. serialize_f64 ( val. value ( ) )
152155 } else if obj_ptr == self . refs . none {
153156 serializer. serialize_unit ( )
0 commit comments