NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

enum.py (2681B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\codereload\enum.py
      2 
      3 
      4 def reloadable_enum(_cls = None, allow_override = False):
      5 
      6     def deco(cls):
      7         if not allow_override and hasattr(cls, '__reload_update__'):
      8             import warnings
      9             warnings.warn("Overriding a __reload_update__ hook\n\n{cls} already has a __reload_update__ hook defined. @reloadable_enum will completely replace that hook with its own. If this is what you want then you can pass 'allow_override=True' to the decorator in order to suppress this warning, like this:\n\n    @reloadable_enum(allow_override=True)\n    class {cls}(...):\n        ...\n".format(cls=cls.__name__))
     10 
     11         def reload_update(old_cls, _old_instance = None):
     12             if _old_instance is not None:
     13                 return _old_instance
     14             from codereload.xreload import _update, deferred_update_global_references
     15             ignore = {'_member_map_', '_member_names_', '_value2member_map_'}
     16             for name, item in cls.__dict__.items():
     17                 if name in ignore or isinstance(item, cls):
     18                     continue
     19                 setattr(old_cls, name, _update(old_cls.__dict__.get(name, None), item))
     20 
     21             old_names = set(old_cls._member_names_)
     22             new_names = set(cls._member_names_)
     23             all_names = old_names.union(new_names)
     24             added_names = new_names - old_names
     25             removed_names = old_names - new_names
     26             for name in all_names:
     27                 if name in removed_names:
     28                     old_cls._member_names_.remove(name)
     29                     del old_cls._value2member_map_[old_cls._member_map_[name].value]
     30                     del old_cls._member_map_[name]
     31                 elif name in added_names:
     32                     old_cls._member_names_.append(name)
     33                     new_item = cls._member_map_[name]
     34                     new_item.__class__ = old_cls
     35                     old_cls._member_map_[name] = new_item
     36                     old_cls._value2member_map_[new_item.value] = new_item
     37                 else:
     38                     del old_cls._value2member_map_[old_cls._member_map_[name].value]
     39                     new_item = cls._member_map_[name]
     40                     old_item = old_cls._member_map_[name]
     41                     old_item._value_ = new_item._value_
     42                     old_cls._value2member_map_[new_item.value] = old_item
     43 
     44             deferred_update_global_references(cls, old_cls)
     45             return old_cls
     46 
     47         setattr(cls, '__reload_update__', reload_update)
     48         return cls
     49 
     50     if _cls is not None:
     51         return deco(_cls)
     52     else:
     53         return deco