lookup.py
上传用户:ghyvgy
上传日期:2009-05-26
资源大小:547k
文件大小:5k
源码类别:

其他游戏

开发平台:

Python

  1. '''
  2. lookup.py - provides several utility functions that can be used to build in memory and on disk lookups
  3. of various types
  4. '''
  5. import pprint
  6. import sys
  7. import imp
  8. def _CreateDict(dbData):
  9. '''
  10. Given dbData from the db that has a single column key, return a dictionary with
  11. the first column as the key, as the value as the remaining column as the value.
  12. Given the following data: [(1, 'Test1', 1), (2, 'Test2', 1)], the result will be { 1 : ('Test1', 1), 2 : ('Test2', 1) }
  13. '''
  14. tempDict = {}
  15. for row in dbData:
  16. key = row[0]
  17. value = row[1:]
  18. # handle case where table only has 1 column, make it the value as well
  19. if len(row) == 1:
  20. value = [1]
  21. tempDict[key] = value
  22. return tempDict
  23. def _CreateMultiWayDict(dbData):
  24. '''
  25. Given dbData from the db, return a dictionary with the first column as the key, and the value
  26. as a list of 1 to n items that have a matching key.  That is,  given the following data: 
  27. [(1, 'Test1', 1), (1, 'Test2', 1)], the result will be { 1 : [('Test1', 1), ('Test2', 1)] }
  28. '''
  29. tempDict = {}
  30. for row in dbData:
  31. key = row[0]
  32. value = row[1:]
  33. if not tempDict.has_key(key):
  34. tempDict[key] = []
  35. tempDict[key].append(value)
  36. return tempDict
  37. def _CreateMultiWayKeyDict(dbData, keyCount):
  38. '''
  39. Given dbData from the db t, return a dictionary with the first keyCount columns as the tuple- 
  40. based key, and the value a list of 1 to n items that have a matching key.  That is, given the 
  41. following data and a keyCount of 2: 
  42. [(1, 117, 'Test1', 1), (1, 117, 'Test2', 1), (2, 134, 'Test3', 0)], the result will be { (1, 117) : [('Test1', 1), ('Test2', 0)], (2, 134) : [('Test3', 0)] }
  43. '''
  44. assert keyCount > 0, 'keyCount must be at least 1'
  45. assert keyCount < len(dbData[0]), 'keyCount must be less than number of columns in returned row'
  46. tempDict = {}
  47. for row in dbData:
  48. key = row[:keyCount]
  49. value = row[keyCount:]
  50. if not tempDict.has_key(key):
  51. tempDict[key] = []
  52. tempDict[key].append(value)
  53. return tempDict
  54. def _BuildInMemoryDictLookup(moduleName, dict, varName = 'lookup'):
  55. '''
  56. Creates or accesses an in memory module of the name moduleName, and 
  57. populates it with an attribute named varName, and the contents of dict
  58. moduleName - name of module to generate/update with dictionary variable
  59. dict       - a valid Python dictionary with the desired contents
  60. varName    - the variable name to give the dictionary in the module
  61. '''  
  62. mod = None
  63. if sys.modules.has_key(moduleName):
  64. mod = sys.modules[moduleName]
  65. else:
  66. mod = imp.new_module(moduleName)
  67. sys.modules[moduleName] = mod
  68. setattr(mod, varName, dict)
  69. def _GenerateOnDiskDictLookup(filePath, dict, varName = 'lookup'):
  70. '''
  71. Generates on on disk file with the name specified in filePath, and
  72. populates it with an attribute named varName, and the contents of dict
  73. filePath   - file path in form '[path]/[moduleName].py', e.g. 'C:/mycode/chattype.py'
  74. dict       - a valid Python dictionary with the desired contents
  75. varName    - the variable name to give the dictionary in the module
  76. '''  
  77. try:
  78. fstream = open(filePath, 'w')
  79. except IOError:
  80. print 'failed to open %s for write' % filePath
  81. return
  82. else:
  83. # write a header for the file
  84. fstream.write('# This file is auto generated from the database.n')
  85. fstream.write('n')
  86. # write the variable for the dictionary out
  87. fstream.write( 'n'+varName+' = \n' )
  88. # use the pprint module to 'pretty print' the contents of the dictionary to the file
  89. pprint.pprint(dict, fstream)
  90. fstream.close()    
  91. def Test():
  92. '''
  93. Tests the various utilities provided in this module, check out the docs
  94. with the utilities for details on their functionality
  95. '''
  96. dbData = [(1, 'Test1', 1), (2, 'Test2', 1)]
  97. dict = _CreateDict(dbData)
  98. _GenerateOnDiskDictLookup('test1.py', dict, 'testVar1')
  99. import test1
  100. print 'n'
  101. print 'Contents of test 1 dict are: %sn' % test1.testVar1
  102. _BuildInMemoryDictLookup('test2', dict, 'testVar2')
  103. import test2
  104. print 'Contents of test 2 dict are: %sn' % test2.testVar2
  105. dbData = [(1, 'Test1', 1), (1, 'Test2', 1)]
  106. dict = _CreateMultiWayDict(dbData)
  107. _GenerateOnDiskDictLookup('test3.py', dict, 'testVar3')
  108. import test3
  109. print 'Contents of test 3 dict are: %sn' % test3.testVar3  
  110. _BuildInMemoryDictLookup('test4', dict, 'testVar4')
  111. import test4
  112. print 'Contents of test 4 dict are: %sn' % test4.testVar4
  113. dbData =  [(1, 117, 'Test1', 1), (1, 117, 'Test2', 1), (2, 134, 'Test3', 0)]
  114. dict = _CreateMultiWayKeyDict(dbData, 2)
  115. _GenerateOnDiskDictLookup('test5.py', dict, 'testVar5')
  116. import test5
  117. print 'Contents of test 5 dict are: %sn' % test5.testVar5
  118. _BuildInMemoryDictLookup('test6', dict, 'testVar6')
  119. import test6
  120. print 'Contents of test 6 dict are: %sn' % test6.testVar6
  121. if __name__ == '__main__':
  122.   Test()