同步操作将从 OpenHarmony-SIG/python 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
"""Helper to provide extensibility for pickle.This is only useful to add pickle support for extension types defined inC, not for instances of user-defined classes."""__all__ = ["pickle", "constructor","add_extension", "remove_extension", "clear_extension_cache"]dispatch_table = {}def pickle(ob_type, pickle_function, constructor_ob=None):if not callable(pickle_function):raise TypeError("reduction functions must be callable")dispatch_table[ob_type] = pickle_function# The constructor_ob function is a vestige of safe for unpickling.# There is no reason for the caller to pass it anymore.if constructor_ob is not None:constructor(constructor_ob)def constructor(object):if not callable(object):raise TypeError("constructors must be callable")# Example: provide pickling support for complex numbers.try:complexexcept NameError:passelse:def pickle_complex(c):return complex, (c.real, c.imag)pickle(complex, pickle_complex, complex)# Support for pickling new-style objectsdef _reconstructor(cls, base, state):if base is object:obj = object.__new__(cls)else:obj = base.__new__(cls, state)if base.__init__ != object.__init__:base.__init__(obj, state)return obj_HEAPTYPE = 1<<9# Python code for object.__reduce_ex__ for protocols 0 and 1def _reduce_ex(self, proto):assert proto < 2cls = self.__class__for base in cls.__mro__:if hasattr(base, '__flags__') and not base.__flags__ & _HEAPTYPE:breakelse:base = object # not really reachableif base is object:state = Noneelse:if base is cls:raise TypeError(f"cannot pickle {cls.__name__!r} object")state = base(self)args = (cls, base, state)try:getstate = self.__getstate__except AttributeError:if getattr(self, "__slots__", None):raise TypeError(f"cannot pickle {cls.__name__!r} object: "f"a class that defines __slots__ without "f"defining __getstate__ cannot be pickled "f"with protocol {proto}") from Nonetry:dict = self.__dict__except AttributeError:dict = Noneelse:dict = getstate()if dict:return _reconstructor, args, dictelse:return _reconstructor, args# Helper for __reduce_ex__ protocol 2def __newobj__(cls, *args):return cls.__new__(cls, *args)def __newobj_ex__(cls, args, kwargs):"""Used by pickle protocol 4, instead of __newobj__ to allow classes withkeyword-only arguments to be pickled correctly."""return cls.__new__(cls, *args, **kwargs)def _slotnames(cls):"""Return a list of slot names for a given class.This needs to find slots defined by the class and its bases, so wecan't simply return the __slots__ attribute. We must walk downthe Method Resolution Order and concatenate the __slots__ of eachclass found there. (This assumes classes don't modify their__slots__ attribute to misrepresent their slots after the class isdefined.)"""# Get the value from a cache in the class if possiblenames = cls.__dict__.get("__slotnames__")if names is not None:return names# Not cached -- calculate the valuenames = []if not hasattr(cls, "__slots__"):# This class has no slotspasselse:# Slots found -- gather slot names from all base classesfor c in cls.__mro__:if "__slots__" in c.__dict__:slots = c.__dict__['__slots__']# if class has a single slot, it can be given as a stringif isinstance(slots, str):slots = (slots,)for name in slots:# special descriptorsif name in ("__dict__", "__weakref__"):continue# mangled nameselif name.startswith('__') and not name.endswith('__'):stripped = c.__name__.lstrip('_')if stripped:names.append('_%s%s' % (stripped, name))else:names.append(name)else:names.append(name)# Cache the outcome in the class if at all possibletry:cls.__slotnames__ = namesexcept:pass # But don't die if we can'treturn names# A registry of extension codes. This is an ad-hoc compression# mechanism. Whenever a global reference to <module>, <name> is about# to be pickled, the (<module>, <name>) tuple is looked up here to see# if it is a registered extension code for it. Extension codes are# universal, so that the meaning of a pickle does not depend on# context. (There are also some codes reserved for local use that# don't have this restriction.) Codes are positive ints; 0 is# reserved._extension_registry = {} # key -> code_inverted_registry = {} # code -> key_extension_cache = {} # code -> object# Don't ever rebind those names: pickling grabs a reference to them when# it's initialized, and won't see a rebinding.def add_extension(module, name, code):"""Register an extension code."""code = int(code)if not 1 <= code <= 0x7fffffff:raise ValueError("code out of range")key = (module, name)if (_extension_registry.get(key) == code and_inverted_registry.get(code) == key):return # Redundant registrations are benignif key in _extension_registry:raise ValueError("key %s is already registered with code %s" %(key, _extension_registry[key]))if code in _inverted_registry:raise ValueError("code %s is already in use for key %s" %(code, _inverted_registry[code]))_extension_registry[key] = code_inverted_registry[code] = keydef remove_extension(module, name, code):"""Unregister an extension code. For testing only."""key = (module, name)if (_extension_registry.get(key) != code or_inverted_registry.get(code) != key):raise ValueError("key %s is not registered with code %s" %(key, code))del _extension_registry[key]del _inverted_registry[code]if code in _extension_cache:del _extension_cache[code]def clear_extension_cache():_extension_cache.clear()# Standard extension code assignments# Reserved ranges# First Last Count Purpose# 1 127 127 Reserved for Python standard library# 128 191 64 Reserved for Zope# 192 239 48 Reserved for 3rd parties# 240 255 16 Reserved for private use (will never be assigned)# 256 Inf Inf Reserved for future assignment# Extension codes are assigned by the Python Software Foundation.
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。