Advertisement
aribahaz

Untitled

Feb 17th, 2018
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.01 KB | None | 0 0
  1. #
  2. #
  3. #
  4.  
  5. import re, traceback, keyword
  6.  
  7. def pnamedtuple(type_name, field_names, mutable=False):
  8. def show_listing(s):
  9. for aline,its_text in enumerate(s.split('\n'), 1):
  10. print(f' {aline: >3} {its_text.rstrip()}')
  11.  
  12. # put your code here
  13. # bind class_definition (used below) to the string constructed for the class
  14.  
  15. def valid_name(name):
  16. reg_val = '([a-zA-Z])+(\w)*'
  17. legal_name = re.compile(reg_val)
  18. if type(name) == str:
  19. if keyword.iskeyword(name) == True or name.isdigit() or legal_name.match(name) == None:
  20. return False
  21. return True
  22.  
  23. if not valid_name(str(type_name)):
  24. raise SyntaxError
  25.  
  26. field_list = []
  27.  
  28. if type(field_names) == list:
  29. for field in field_names:
  30. if not valid_name(field):
  31. raise SyntaxError
  32. elif field not in field_list:
  33. field_list.append(field)
  34.  
  35. elif type(field_names) == str:
  36. fields = re.sub('\,', '', field_names).split()
  37. for val in fields:
  38. if not valid_name(val):
  39. raise SyntaxError
  40. elif len(val) > 0 and val not in field_list:
  41. field_list.append(val)
  42. else:
  43. raise SyntaxError
  44.  
  45. class_template = '''
  46. class {type_name}:
  47. def __init__(self, {list_names}):
  48. self._fields = {field_list}
  49. self._mutable = {self_mutable}
  50. {args}'''
  51.  
  52. repr_template = '''
  53. def __repr__(self):
  54. return '{type_name}({str_format})'.format({self_format})'''
  55.  
  56. template_get = '''
  57. def get_{field}(self):
  58. return self.{field}'''
  59.  
  60.  
  61. get_format = ''' \
  62. def get_{name}(self):
  63. return self.{name}'''
  64.  
  65.  
  66. #**********Change self._mutable = mutable(variable) if attempting extra credit - setattr
  67.  
  68.  
  69. getitem_template = '''\
  70. def __getitem__(self):
  71. pass
  72.  
  73. '''
  74.  
  75. eq_template = '''\
  76. def __eq__(self):
  77. pass
  78. '''
  79. replace_template = '''\
  80. def _replace(self):
  81. pass
  82. '''
  83.  
  84. #***********EXTRA CREDIT***************
  85. setattr_template = '''\
  86. def __setattr__(self):
  87. pass
  88. '''
  89. class_definition = class_template.format(
  90. type_name = type_name,
  91. list_names = ','.join(field for field in field_list),
  92. args = ('\n'+8*' ').join('self.{name}={name}'.format(name = field) for field in field_list),
  93. field_list = field_list,
  94. self_mutable = False)
  95.  
  96. class_definition += repr_template.format(
  97. type_name = type_name,
  98. str_format = ','.join('{name}={{{name}}}'.format(name = field) for field in field_list),
  99. self_format = ','.join('{name}=self.{name}'.format(name = field) for field in field_list ))
  100.  
  101. class_definition += "".join([template_get.format(field = field) for field in field_list])
  102.  
  103.  
  104. # For initial debugging, remove comment to show the source code for the class
  105. show_listing(class_definition)
  106.  
  107. # Execute the class_definition string in a local name space; later, bind the
  108. # source_code name in its dictionary to the class_defintion; return the
  109. # class object created; if there is a syntax error, list the class and
  110. # also show the error
  111. name_space = dict(__name__ = f'pnamedtuple_{type_name}')
  112. try:
  113. exec(class_definition,name_space)
  114. name_space[type_name].source_code = class_definition
  115. except [TypeError, SyntaxError]:
  116. show_listing(class_definition)
  117. traceback.print_exc()
  118. return name_space[type_name]
  119.  
  120.  
  121.  
  122. if __name__ == '__main__':
  123. # Test pnamedtuple in script below using Point = pnamedtuple('Point', 'x y')
  124.  
  125. #driver tests
  126. import driver
  127. driver.default_file_name = 'bscp3W18.txt'
  128. # driver.default_show_exception= True
  129. # driver.default_show_exception_message= True
  130. # driver.default_show_traceback= True
  131. driver.driver()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement