def register_event(cls, event_name=None, func_to_register=None): ''' @fun_Class.register_event() # @fun_Class.register_event === @fun_Class.register_event() def event_key_down(ev): pass OR @fun_Class.register_event(event_name) # event_name=KEYDOWN (or "key_down") def whatever(ev): pass OR fun_Class.register_event(event_name,func) ''' if (event_name is None) and (func_to_register is None): # i.e No param passed, used as decorator (1st step of ex. 1) logging.info("Nothing passed") return cls.register_event elif (not(event_name is None)) and (func_to_register is None): # i.e. one param is passed, maybe func or (str or int) logging.info("Event Name only passed") if isinstance(event_name, int) or isinstance(event_name, str): # i.e. 1st parm-> str or int, is event name, acts as decorator # (2nd ex.) # dont hardcode func name- use metaclass logging.info("Event Name is event_name") return partial(cls.register_event, event_name) elif hasattr(event_name, "__call__"): # first param is func, actually func_to_register. # So get event_name from func_name (2nd step of 1st ex.) logging.info("Event Name is actually func") func_to_register = event_name event_name = fuzzy_match_event_name(func_to_register.func_name) return cls.register_event(event_name, func_to_register) else: raise TypeError("event_name must be (str or int) or func") else: # Both params present logging.info("Both param passed") if isinstance(event_name, str): event_name = fuzzy_match_event_name(event_name) event_numb = KW_EVENTS[event_name] elif isinstance(event_name, int): event_numb = event_name else: raise TypeError("event_name should be str or int") logging.info("Registering func") if not (event_numb in cls.dict_action_func): cls.dict_action_func[event_numb] = [] cls.dict_action_func[event_numb].append(func_to_register) return func_to_register
def _check_event(cls, ev_name_or_type, new_or_old): ''' ev_name_or_type => name_or_type(numb)_of_event new_or_old => current_event_list or old_event_list ''' matched_events = [] if new_or_old == "new": list_to_check = cls.game_class.list_event elif new_or_old == "old": list_to_check = cls.game_class.list_event_old else: raise AttributeError("new_or_old must be 'new' or 'old'.") if type(ev_name_or_type) is int: ev_type = ev_name_or_type elif type(ev_name_or_type) is str: ev_name = fuzzy_match_event_name(ev_name_or_type, "event") ev_type = KW_EVENTS_ALL[ev_name] for ev in list_to_check: if ev.type == ev_type: matched_events.append(ev) return matched_events