#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package # # @todo:¶ÁÈ¡PY±í # @author hxp # @date 2018-05-10 # @version 1.0 # # ÏêϸÃèÊö: ¶ÁÈ¡PY±í # #------------------------------------------------------------------------------- #"""Version = 2018-05-10 12:00""" #------------------------------------------------------------------------------- import FormulaControl import ChConfig import LogUI import hashlib import os import gc '''±í½á¹¹¶¨Òå×Öµä { ±íÃû:( (×Ö¶ÎÀàÐÍ, ×Ö¶ÎÃû, ÊÇ·ñ²éѯË÷Òý), ... ), ... } ''' Def_IpyTable = { #<%Table_Def%> } #<%Table_Class%> def Log(msg, playerID=0, par=0): LogUI.Msg("%s\t%s\t%s" % (par, playerID, msg)) return def ErrLog(msg, playerID=0, par=0): LogUI.Msg("%s\t%s\t###Error:%s" % (par, playerID, msg)) return ## PY±íÊý¾Ý¹ÜÀíÀà class IPY_DataMgr(): def __init__(self): Log("IPY_DataMgr Init...") self.fileMD5Dict = {} # Êý¾Ý±íÎļþmd5×Öµä, ÓÃÓÚ¶Ô±ÈÎļþ²îÒìÅжÏÊÇ·ñÖØ¶Á {dtName:md5, ...} self.ipyConfigEx = {} # ×Ô¶¨ÒåÊý¾Ý»º´æ {key:configData, ...} self.ipyDataIndexMap = {} # Êý¾Ý±íË÷Òý²éѯ»º´æ {dtName:{args:[index, ...], ...}, ...} self.ipyDataIndexMapEx = {} # Êý¾Ý±í×Ô¶¨Òå²éѯÌõ¼þ²éѯ»º´æ {dtName_(findKey,...):{(findKeyValue, ...):[index, ...], ...}, ...} self.ipyFuncConfigDict = {} # ¹¦ÄÜÅäÖÃ±í»º´æ {key:IPY_FuncConfig, ...} self.classSizeDict = {} # Êý¾Ý±íÀà¶ÔÏóÕ¼ÓÃÄÚ´æ´óС {dtName:size, ...} self.IpyDataClear(True) return def Recycle(self): Log("IPY_DataMgr Recycle") for tableName in Def_IpyTable.keys(): if not hasattr(self, "ipy%sLen" % tableName): continue cacheList = getattr(self, "ipy%sCache" % tableName) del cacheList delattr(self, "ipy%sLen" % tableName) delattr(self, "ipy%sCache" % tableName) Log("Recycle IPY_%s" % tableName) del self.fileMD5Dict, self.ipyConfigEx, self.ipyDataIndexMap, self.ipyDataIndexMapEx, self.ipyFuncConfigDict, self.classSizeDict self.fileMD5Dict = {} self.ipyConfigEx = {} self.ipyDataIndexMap = {} self.ipyDataIndexMapEx = {} self.ipyFuncConfigDict = {} self.classSizeDict = {} gc.collect() return def LoadAll(self): ## ¼ÓÔØÈ«²¿Êý¾Ý£¬²âÊÔÄÚ´æÓã¬Êµ¼ÊÓ¦ÓÃÖв»µ÷Óà for tableName in Def_IpyTable.keys(): setattr(self, "ipy%sLen" % tableName, 0) self.IpyDataClear() return def IpyDataClear(self, onlyCheck=False): Log("IPY_DataMgr Reload... onlyCheck=%s" % onlyCheck) if not onlyCheck: self.ipyConfigEx = {} #<%Ipy_Cache_Init%> Log("IPY_DataMgr ReloadOK! onlyCheck=%s" % onlyCheck) return def CheckLoadData(self, dtName): if hasattr(self, "ipy%sLen" % dtName): return setattr(self, "ipy%sLen" % dtName, 0) # ÉèÖøÃÊôÐÔ£¬Í¨¹ýÅжÏÊÇ·ñÓиÃÊôÐÔ¾ö¶¨ÊÇ·ñ¼ÓÔØ self.__LoadFileData(dtName) return def __LoadFileData(self, tableName, onlyCheck=False): # @param onlyCheck: ÊÇ·ñ½ö¼ì²é¸ñʽ£¬Ò»°ãÆô¶¯Ê±Óà curPath = "<%LoadStructPath%>" + "\\PySysDB\\tag" + tableName + ".txt" if not os.path.isfile(curPath): ErrLog("can not find file = %s,%s" % (tableName, curPath)) raise Exception("can not find file = %s,%s" % (tableName, curPath)) if not onlyCheck: if not hasattr(self, "ipy%sLen" % tableName): # ûÓиÃÊôÐԵIJ»¼ÓÔØ return fileObj = open(curPath, 'rb') content = fileObj.read() fileObj.close() if not onlyCheck: md5_obj = hashlib.md5() md5_obj.update(content) newMD5Code = md5_obj.hexdigest() if tableName in self.fileMD5Dict: oldMD5Code = self.fileMD5Dict[tableName] if newMD5Code == oldMD5Code: return getattr(self, "ipy%sCache" % tableName) if tableName in self.ipyDataIndexMap: self.ipyDataIndexMap.pop(tableName) for dtName_Findkey in self.ipyDataIndexMapEx.keys(): findStr = "%s_" % tableName if findStr in dtName_Findkey: self.ipyDataIndexMapEx.pop(dtName_Findkey) if tableName == "FuncConfig": self.ipyFuncConfigDict = {} self.fileMD5Dict[tableName] = newMD5Code dataIndex = 0 indexDict = {} cacheList = [] fieldList = Def_IpyTable[tableName] infoList = content.split('\r\n') curClassSizeTotal = 0 dataCount = 0 Class = eval("IPY_%s" % tableName) for line in xrange(len(infoList)): if line == 0: continue if not infoList[line]: #ErrLog("line not content! %s, line=%s" % (tableName, line)) continue rowList = infoList[line].split('\t') if len(fieldList) != len(rowList): ErrLog("field count error!, %s, line=%s, len=%s,rowCount=%s" % (tableName, line, len(fieldList), len(rowList))) raise Exception("field count error!, %s, line=%s, len=%s,rowCount=%s" % (tableName, line,len(fieldList), len(rowList))) if tableName == "FuncConfig": classObj = self.__LoadFuncConfigData(fieldList, rowList, onlyCheck) dataCount += 1 if onlyCheck: continue curClassSizeTotal += ChConfig.GetSizeof(classObj) continue try: indexKey = [] valueList = [] for j, value in enumerate(rowList): fieldType, fieldName, isIndex = fieldList[j] if fieldType == "char": attrValue = value elif fieldType == "dict": attrValue = self.__StrToDict(value) if type(attrValue) != dict: raise elif fieldType == "list": attrValue = self.__StrToList(value) if type(attrValue) not in [list, tuple]: raise elif fieldType == "eval": attrValue = self.__StrToEval(value) elif fieldType == "float": attrValue = float(value) else: attrValue = 0 if not value.isdigit() else int(value) valueList.append(attrValue) if isIndex: indexKey.append(attrValue) dataCount += 1 if onlyCheck: continue classObj = Class() setattr(classObj, "attrTuple", tuple(valueList)) curClassSizeTotal += ChConfig.GetSizeof(classObj) cacheList.append(classObj) indexKey = tuple(indexKey) indexList = indexDict.get(indexKey, []) indexList.append(dataIndex) indexDict[indexKey] = indexList dataIndex += 1 except BaseException: ErrLog("SetIpyDataError: tableName=%s,line=%s,fieldName=%s,fieldType=%s,value=%s" % (tableName, line, fieldName, fieldType, value)) raise if onlyCheck: Log("CheckIpydata: %s, dataCount=%s OK" % (tableName, dataCount)) return if tableName != "FuncConfig": self.ipyDataIndexMap[tableName] = indexDict self.classSizeDict[tableName] = curClassSizeTotal classSizeTotal = sum(self.classSizeDict.values()) alreadyLoad = len(self.classSizeDict) setattr(self, "ipy%sCache" % tableName, cacheList) setattr(self, "ipy%sLen" % tableName, len(cacheList)) Log("LoadIpydata: %s, dataCount=%s, alreadyLoad=%s" % (tableName, dataCount, alreadyLoad), curClassSizeTotal, classSizeTotal) return def __LoadFuncConfigData(self, fieldList, rowList, onlyCheck): key = rowList[0] valueList = [key] for i, strValue in enumerate(rowList): if i == 0: continue try: strValue = strValue.lstrip().rstrip() if strValue.isdigit(): configValue = int(strValue) elif (strValue.startswith("{") and strValue.endswith("}")) \ or (strValue.startswith("[") and strValue.endswith("]")) \ or (strValue.startswith("(") and strValue.endswith(")")): configValue = eval(strValue) elif "_" in strValue and type(self.__StrToDict(strValue)) == dict: configValue = self.__StrToDict(strValue) elif ChConfig.Def_Str_Montant in strValue: configValue = eval("(%s,)" % strValue.replace(ChConfig.Def_Str_Montant, ",")) elif strValue in ["-", ""]: configValue = "" else: configValue = self.__ToFloat(strValue) except BaseException: ErrLog("SetIpyDataError: tableName=%s,key=%s,i=%s,value=%s" % ("FuncConfig", key, i, strValue)) raise if onlyCheck: continue valueList.append(configValue) if onlyCheck: return funcConfigObj = IPY_FuncConfig() setattr(funcConfigObj, "attrTuple", tuple(valueList)) self.ipyFuncConfigDict[key] = funcConfigObj return funcConfigObj def __ToFloat(self, strValue): try: value = float(strValue) except: return strValue return value def __StrToEval(self, strValue): if not strValue or strValue in ["0", "-", ""]: return return eval(strValue) def __StrToDict(self, strValue): setDict = {} if "{" in strValue and "}" in strValue: setDict = eval(strValue) elif strValue in ["0", "-", ""]: pass else: keyValueList = strValue.split(ChConfig.Def_Str_Montant) for keyValue in keyValueList: if "_" not in keyValue: continue kv = keyValue.split("_") if len(kv) != 2: return key, value = kv if key.isdigit(): key = int(key) if value.isdigit(): value = int(value) setDict[key] = value return setDict def __StrToList(self, strValue): setList = [] if ("[" in strValue and "]" in strValue) or ("(" in strValue and ")" in strValue): setList = eval(strValue) elif strValue in ["0", "-", ""]: pass elif strValue.isdigit(): setList = (int(strValue),) else: for value in strValue.split(ChConfig.Def_Str_Montant): if value.isdigit(): value = int(value) setList.append(value) if setList: setList = tuple(setList) return setList #<%Ipy_Cache_Func%> IPYData = IPY_DataMgr() def IPY_Data(): return IPYData def GetConfigEx(key): '''»ñÈ¡×Ô¶¨Òåkey»º´æÊý¾Ý ''' if key in IPYData.ipyConfigEx: return IPYData.ipyConfigEx[key] return def SetConfigEx(key, configData): '''ÉèÖÃ×Ô¶¨Òåkey»º´æÊý¾Ý ÓÐЩ±íµÄÅäÖÃÄÚÈÝ¿ÉÄÜÔÚʵ¼Ê¹¦ÄÜʹÓÃÖÐÖ±½ÓʹÓñíÊý¾ÝµÄ»°»á±È½ÏÂé·³£¬±ÈÈçÿ´Î¶¼Òª±éÀú»ñȡһЩ±íÊý¾Ý Èç¹û¾­¹ýÒ»²ãÊý¾Ýת»»ºóÔÙÀ´Ê¹ÓøÃÊý¾ÝµÄ»°»á¼ò»¯¹¦ÄÜÂß¼­»òÌá¸ßЧÂÊ£¬Ôò¿ÉÒÔͨ¹ýº¯Êý±£´æÒ»Ð©×Ô¶¨ÒåµÄ»º´æÄÚÈÝ£¬·½±ã¹¦ÄÜʹÓà Ҳ¿ÉÒÔÊÊÓÃÓÚÆäËû×Ô¶¨Ò建´æ´æ´¢ ''' IPYData.ipyConfigEx[key] = configData return configData def GetIpyGameData(dtName, *args): '''»ñÈ¡±íÊý¾Ý£¬ÊÊÓÃÓÚÊý¾ÝΨһµÄ£¬·µ»Øµ¥ÌõÊý¾ÝʵÀý @param dtName: ±íÃû£¬²»º¬tag @param args: ½¨±íʱÉèÖõÄË÷Òý×Ö¶Î˳Ðò¶ÔÓ¦µÄ²éѯֵ @return: ¶ÔÓ¦²éѯÌõ¼þµÄ ipyData Êý¾ÝʵÀý£¬Ö»·µ»Øµ¥¸öʵÀý @ʹÓÃ˵Ã÷: IpyGameDataPY.GetIpyGameData(±íÃû, Ë÷Òý1²éѯֵ, Ë÷Òý2²éѯֵ, ¡­ ) ''' IPYData.CheckLoadData(dtName) if dtName not in IPYData.ipyDataIndexMap: ErrLog("Can not found ipyData dtName=%s" % (dtName)) return indexDict = IPYData.ipyDataIndexMap[dtName] if args not in indexDict: ErrLog("Can not found ipyData dtName=%s,indexValue=%s" % (dtName, args)) return indexList = indexDict[args] return getattr(IPYData, "ipy%sCache" % dtName)[indexList[0]] def GetIpyGameDataList(dtName, *args): '''»ñÈ¡±íÊý¾Ý£¬ÊÊÓÃÓÚ²éѯ½á¹ûÓжàÌõÊý¾ÝµÄ @param dtName: ±íÃû£¬²»º¬tag @param args: ½¨±íʱÉèÖõÄË÷Òý×Ö¶Î˳Ðò¶ÔÓ¦µÄ²éѯֵ @return: ¶ÔÓ¦²éѯÌõ¼þµÄ ipyData Êý¾ÝʵÀýÁбí @ʹÓÃ˵Ã÷: Óë GetIpyGameData º¯ÊýÏàͬ ''' IPYData.CheckLoadData(dtName) if dtName not in IPYData.ipyDataIndexMap: ErrLog("Can not found ipyDataList dtName=%s" % (dtName)) return indexDict = IPYData.ipyDataIndexMap[dtName] if args not in indexDict: ErrLog("Can not found ipyDataList dtName=%s,indexValue=%s" % (dtName, args)) return indexList = indexDict[args] dataCache = getattr(IPYData, "ipy%sCache" % dtName) return [dataCache[i] for i in indexList] def GetIpyGameDataNotLog(dtName, *args): '''Óë GetIpyGameData º¯ÊýÏàͬ, Ö»ÊÇÕÒ²»µ½Êý¾Ýʱ²»»áÊä³öÈÕÖ¾ ''' IPYData.CheckLoadData(dtName) if dtName not in IPYData.ipyDataIndexMap: #ErrLog("Can not found ipyData dtName=%s" % (dtName)) return indexDict = IPYData.ipyDataIndexMap[dtName] if args not in indexDict: #ErrLog("Can not found ipyData dtName=%s,indexValue=%s" % (dtName, args)) return indexList = indexDict[args] return getattr(IPYData, "ipy%sCache" % dtName)[indexList[0]] def GetIpyGameDataListNotLog(dtName, *args): '''Óë GetIpyGameDataList º¯ÊýÏàͬ, Ö»ÊÇÕÒ²»µ½Êý¾Ýʱ²»»áÊä³öÈÕÖ¾ ''' IPYData.CheckLoadData(dtName) if dtName not in IPYData.ipyDataIndexMap: #ErrLog("Can not found ipyDataList dtName=%s" % (dtName)) return indexDict = IPYData.ipyDataIndexMap[dtName] if args not in indexDict: #ErrLog("Can not found ipyDataList dtName=%s,indexValue=%s" % (dtName, args)) return indexList = indexDict[args] dataCache = getattr(IPYData, "ipy%sCache" % dtName) return [dataCache[i] for i in indexList] def GetIpyGameDataByCondition(dtName, keyDict={}, returnList=False, isLogNone=True): '''¸ù¾Ý×Ô¶¨Òå²éѯÌõ¼þ²éѯ±íÊý¾Ý£¬ÓÉÓÚĿǰֻ֧³Ö½¨Á¢Ò»×é²éѯË÷Òý£¬ËùÒÔʹÓÃÆäËû²éѯÌõ¼þ²é±íʱֻÄÜͨ¹ý¸Ãº¯Êý²éÕÒ @param dtName: ±íÃû£¬²»º¬tag @param keyDict: ²éѯÌõ¼þ×Öµä {²éѯ×Ö¶ÎÃû:²éѯֵ, ...} @param returnList: ÊÇ·ñÒÔÁбíµÄÐÎʽ·µ»Ø²éѯÊý¾Ý£¬Ä¬ÈÏ·ñ @param isLogNone: ÕÒ²»µ½Êý¾ÝʱÊÇ·ñÊý¾ÝÈÕÖ¾£¬Ä¬ÈÏÊÇ @return: ÕÒ²»µ½Êý¾Ýʱ·µ»Ø None£¬ÓÐÊý¾Ýʱ¸ù¾Ý²ÎÊýÊÇ·ñ·µ»ØÁÐ±í·µ»Ø¶ÔÓ¦µÄÊý¾ÝʵÀý»òÊý¾ÝʵÀýÁбí ''' IPYData.CheckLoadData(dtName) fieldList = keyDict.keys() valueList = keyDict.values() findFieldKey = "%s_%s" % (dtName, fieldList) findValueKey = tuple(valueList) cacheList = getattr(IPYData, "ipy%sCache" % dtName) if findFieldKey not in IPYData.ipyDataIndexMapEx: indexMapDict = {} for index, iData in enumerate(cacheList): valuekey = tuple([getattr(iData, "Get%s" % field)() for field in fieldList]) indexList = indexMapDict.get(valuekey, []) indexList.append(index) indexMapDict[valuekey] = indexList IPYData.ipyDataIndexMapEx[findFieldKey] = indexMapDict indexMapDict = IPYData.ipyDataIndexMapEx[findFieldKey] if findValueKey not in indexMapDict: if isLogNone: ErrLog("GetIpyGameDataByCondition can not found data! %s %s" % (dtName, keyDict)) return indexList = indexMapDict[findValueKey] if not returnList: return cacheList[indexList[0]] return [cacheList[index] for index in indexList] def GetFuncCfgIpyData(key): '''¶Á¹¦ÄÜÅäÖñíÅäÖÃʵÀý @param key: ÅäÖÃkey @return: Ö±½Ó·µ»Ø¸ÃÅäÖÃkey¶ÔÓ¦µÄÅäÖÃipyDataʵÀý ''' IPYData.CheckLoadData("FuncConfig") if key not in IPYData.ipyFuncConfigDict: ErrLog("Can not found ipyData FuncConfig key=%s!" % key) return "" return IPYData.ipyFuncConfigDict[key] def GetFuncCfg(key, index=1): '''¶Á¹¦ÄÜÅäÖñíÅäÖÃרÓú¯Êý @param key: ÅäÖÃkey @param index: µÚ¼¸¸öÅäÖÃÖµ£¬Ö§³Ö1~5 @return: Ö±½Ó·µ»Ø¶ÔÓ¦µÄÊý¾ÝÀàÐÍ int¡¢str£¬²»ÓÃÔÙÊÖ¶¯×ªint ''' IPYData.CheckLoadData("FuncConfig") if key not in IPYData.ipyFuncConfigDict: ErrLog("Can not found ipyData FuncConfig key=%s!" % key) return "" cfgObj = IPYData.ipyFuncConfigDict[key] if index == 1: return cfgObj.attrTuple[1] if index == 2: return cfgObj.attrTuple[2] if index == 3: return cfgObj.attrTuple[3] if index == 4: return cfgObj.attrTuple[4] if index == 5: return cfgObj.attrTuple[5] ErrLog("Can not found ipyData FuncConfig key=%s,index=%s!" % (key, index)) return "" def GetFuncEvalCfg(key, index=1, defaultValue=[]): '''¶ÁÈ¡¹¦ÄÜÅäÖñíÅäÖÃÁÐ±í¡¢×Öµä¸ñʽרÓú¯Êý @param key: ÅäÖÃkey @param index: µÚ¼¸¸öÅäÖÃÖµ£¬Ö§³Ö1~5 @return: Ö±½Ó·µ»Ø¶ÔÓ¦µÄÊý¾ÝÀàÐÍ list¡¢dict¡¢tuple£¬²»ÓÃÔÙeval ÓÉÓڲ߻®ÓÐ×Ô¶¨ÒåµÄÁбí½á¹¹ obj|¡­ , µ±¸ÃÁбíÅäÖÃÖ»ÓÐÒ»¸öÔªËØÊ±£¬´ËʱÅäÖõÄÄÚÈÝΪµ¥¸öÊýÖµ£¬¼ÓÔØµÄÅäÖõÄʱºò´ËÌõÊý¾Ý»á±»×ªÎªintÐÍ ¹ÊʹÓøÃרÓú¯Êý·µ»ØÁбí½á¹¹£¬·½±ã¹¦ÄÜ¿ª·¢Ê±²»ÓÃÔÙ¿¼ÂÇÁбíΪintʱµÄÇé¿ö£» µ±È»Èç¹ûÅäÖõÄÄÚÈݱ¾Éí¾ÍΪpythonµÄÁÐ±í¡¢×Öµä½á¹¹µÄ»°¿ÉʹÓÃÉÏÃæµÄº¯Êý ²»¹ýΪÁËͳһ£¬½¨Ò鹦ÄÜÅäÖñí¶ÁÁÐ±í¡¢×Öµäʱ¶¼Ê¹Óøú¯Êý ''' IPYData.CheckLoadData("FuncConfig") if key not in IPYData.ipyFuncConfigDict: ErrLog("Can not found ipyData FuncConfig key=%s!" % key) return defaultValue cfgObj = IPYData.ipyFuncConfigDict[key] if index == 1: curConfig = cfgObj.attrTuple[1] elif index == 2: curConfig = cfgObj.attrTuple[2] elif index == 3: curConfig = cfgObj.attrTuple[3] elif index == 4: curConfig = cfgObj.attrTuple[4] elif index == 5: curConfig = cfgObj.attrTuple[5] else: ErrLog("Can not found ipyData FuncConfig key=%s,index=%s!" % (key, index)) return defaultValue curType = type(curConfig) if curType in [list, tuple, dict]: return curConfig if curType == int: return [curConfig] return defaultValue def GetFuncCompileCfg(key, index=1): '''»ñÈ¡¹¦ÄÜÅäÖñíÒѱàÒë¹ýµÄ¹«Ê½ @param key: ÅäÖÃkey @param index: µÚ¼¸¸öÅäÖÃÖµ£¬Ö§³Ö1~5 @return: ·µ»ØÒѱàÒë¹ýµÄ¹«Ê½ ''' return FormulaControl.GetCompileFormula(key + str(index), str(GetFuncCfg(key, index))) def InterpolationSearch(dtName, keyName, keyValue, conditionDict={}): '''²éѯÌõ¼þÏÂÓë¶ÔÓ¦²éѯ×ֶβο¼ÖµÏà½üµÄÊý¾ÝʵÀý£»²Î¿¼ÖµÐ¡ÓÚÅäÖñí×îСֵʱ·µ»Ønone£¬´óÓÚ×î´óֵʱ·µ»Ø×î´óÖµ¶ÔÓ¦µÄʵÀý @param dtName: ±íÃû£¬²»º¬tag @param keyName: ²Î¿¼×Ö¶ÎÃû @param keyValue: ²Î¿¼×Ö¶ÎÖµ£¬´óÓÚµÈÓÚ×Ö¶Îֵʱ·µ»Ø¶ÔÓ¦Êý¾Ý @param conditionDict: ²éѯÌõ¼þ£¬{²éѯ×Ö¶ÎÃû:×Ö¶ÎÖµ, ...} @return: ÕÒ²»µ½Êý¾Ý·µ»Ø None £¬ ·ñÔò·µ»Ø¶ÔÓ¦µÄ ipyData Êý¾ÝʵÀý ''' IPYData.CheckLoadData(dtName) if not conditionDict: dataList = getattr(IPYData, "ipy%sCache" % dtName) else: dataList = GetIpyGameDataByCondition(dtName, conditionDict, True) if not dataList: return low = 0 lowData = dataList[0] lowValue = getattr(lowData, "Get%s" % keyName)() if keyValue < lowValue: return high = len(dataList) - 1 highData = dataList[high] highValue = getattr(highData, "Get%s" % keyName)() if keyValue >= highValue: return highData near = low + int((high - low) * (keyValue - lowValue)/(highValue - lowValue)) nearData = dataList[near] nearValue = getattr(nearData, "Get%s" % keyName)() if keyValue < nearValue: for i in xrange(near - 1, low - 1, -1): nearData = dataList[i] nearValue = getattr(nearData, "Get%s" % keyName)() if nearValue <= keyValue: return nearData elif keyValue > nearValue: for i in xrange(near + 1, high + 1): nearData = dataList[i] nearValue = getattr(nearData, "Get%s" % keyName)() if nearValue > keyValue: return dataList[i - 1] return nearData #if __name__ == "__main__": # IPYDataTotalSize = ChConfig.GetSizeof(IPYData) # classSizeSum = sum(IPYData.classSizeDict.values()) # Log("Êý¾ÝÀàÄÚ´æ: %s b = %s M" % (classSizeSum, str(classSizeSum/float(1024*1024)))) # Log("×ÜÕ¼ÓÃÄÚ´æ: %s b = %s M" % (IPYDataTotalSize, str(IPYDataTotalSize/float(1024*1024)))) # for key in ["OpenBagItem", "RuneUnlock", "IceLodeNeedPoint", "RealmDifficulty", "TongTianLing", "TongTianLingaaa"]: # for i in range(1, 6): # v = GetFuncCfg(key, i) # Log("key:%s,i=%s,value=%s\t%s" % (key, i, type(v), str(v))) # # ipyData = GetIpyGameData("FlashGiftbag", 303) # giftbagIpyDataList = GetIpyGameDataByCondition("FlashGiftbag", {"GiftbagType":1002}, True, True) # for ipyData in giftbagIpyDataList: # print # print type(ipyData.GetGiftbagID()), ipyData.GetGiftbagID() # print type(ipyData.GetGiftbagType()), ipyData.GetGiftbagType() # print type(ipyData.GetOriginalRMB()), ipyData.GetOriginalRMB() # print type(ipyData.GetBuyCountLimit()), ipyData.GetBuyCountLimit() # print type(ipyData.GetGiftItemList()), ipyData.GetGiftItemList() # print type(ipyData.GetMainItemID()), ipyData.GetMainItemID() # print type(ipyData.GetNotifyKey()), ipyData.GetNotifyKey() # # collNPCIpyDataList = GetIpyGameDataListNotLog("MapRefreshNPC", 32050) # if collNPCIpyDataList: # npcIDList = [] # for ipyData in collNPCIpyDataList: # print # print type(ipyData.GetMapID()), ipyData.GetMapID() # print type(ipyData.GetNPCIDList()), ipyData.GetNPCIDList() # print type(ipyData.GetRefreshMarkList()), ipyData.GetRefreshMarkList() # npcIDList += ipyData.GetNPCIDList() # print "npcIDList", npcIDList # else: # print "None" # # ipyData = GetIpyGameData("RuneCompound", 4415) # if ipyData: # print # print type(ipyData.GetTagItemID()), ipyData.GetTagItemID() # print type(ipyData.GetNeedItem()), ipyData.GetNeedItem() # print type(ipyData.GetNeedMJ()), ipyData.GetNeedMJ() # else: # print "None" # # ipyData = GetIpyGameData("DailyGiftbag", 703, 105) # if ipyData: # print # print type(ipyData.GetGiftbagType()), ipyData.GetGiftbagType() # print type(ipyData.GetGiftbagID()), ipyData.GetGiftbagID() # print type(ipyData.GetBuyCountLimit()), ipyData.GetBuyCountLimit() # print type(ipyData.GetGiftItemList()), ipyData.GetGiftItemList() # else: # print "None"