(self, obj, name=None)
| 1152 | dispatch[frozenset] = save_frozenset |
| 1153 | |
| 1154 | def save_global(self, obj, name=None): |
| 1155 | write = self.write |
| 1156 | memo = self.memo |
| 1157 | |
| 1158 | if name is None: |
| 1159 | name = getattr(obj, '__qualname__', None) |
| 1160 | if name is None: |
| 1161 | name = obj.__name__ |
| 1162 | |
| 1163 | module_name = whichmodule(obj, name) |
| 1164 | if self.proto >= 2: |
| 1165 | code = _extension_registry.get((module_name, name), _NoValue) |
| 1166 | if code is not _NoValue: |
| 1167 | if code <= 0xff: |
| 1168 | data = pack("<B", code) |
| 1169 | if data == b'\0': |
| 1170 | # Should never happen in normal circumstances, |
| 1171 | # since the type and the value of the code are |
| 1172 | # checked in copyreg.add_extension(). |
| 1173 | raise RuntimeError("extension code 0 is out of range") |
| 1174 | write(EXT1 + data) |
| 1175 | elif code <= 0xffff: |
| 1176 | write(EXT2 + pack("<H", code)) |
| 1177 | else: |
| 1178 | write(EXT4 + pack("<i", code)) |
| 1179 | return |
| 1180 | |
| 1181 | if self.proto >= 4: |
| 1182 | self.save(module_name) |
| 1183 | self.save(name) |
| 1184 | write(STACK_GLOBAL) |
| 1185 | elif '.' in name: |
| 1186 | # In protocol < 4, objects with multi-part __qualname__ |
| 1187 | # are represented as |
| 1188 | # getattr(getattr(..., attrname1), attrname2). |
| 1189 | dotted_path = name.split('.') |
| 1190 | name = dotted_path.pop(0) |
| 1191 | save = self.save |
| 1192 | for attrname in dotted_path: |
| 1193 | save(getattr) |
| 1194 | if self.proto < 2: |
| 1195 | write(MARK) |
| 1196 | self._save_toplevel_by_name(module_name, name) |
| 1197 | for attrname in dotted_path: |
| 1198 | save(attrname) |
| 1199 | if self.proto < 2: |
| 1200 | write(TUPLE) |
| 1201 | else: |
| 1202 | write(TUPLE2) |
| 1203 | write(REDUCE) |
| 1204 | else: |
| 1205 | self._save_toplevel_by_name(module_name, name) |
| 1206 | |
| 1207 | self.memoize(obj) |
| 1208 | |
| 1209 | def _save_toplevel_by_name(self, module_name, name): |
| 1210 | if self.proto >= 3: |
no test coverage detected