Advertisement
OneNight

Метод-член с динамической сигнатурой через декоратор

Aug 7th, 2019
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.92 KB | None | 0 0
  1. from functools import wraps
  2.  
  3.  
  4. def customizable_args(new_kwargs):
  5.     def wrapper(function):
  6.         @wraps(function)
  7.         def wrapped_function(self, **kwargs):
  8.             kw_arguments = dict()
  9.             kw_arguments.update(new_kwargs)
  10.             kw_arguments.update(kwargs)
  11.             function(self, **kw_arguments)
  12.         return wrapped_function
  13.     return wrapper
  14.  
  15.  
  16. class InsertQuery:
  17.     def __init__(self, table: str, fields: list):
  18.         self.__table = table
  19.         self.__fields = str()
  20.         self.__values_pattern = str()
  21.         arguments = str()
  22.         for field in fields:
  23.             if self.__fields:
  24.                 self.__fields += ', '
  25.                 arguments += ', '
  26.             self.__fields += field
  27.             arguments += (field + ' = None')
  28.             if self.__values_pattern:
  29.                 self.__values_pattern += ', '
  30.             self.__values_pattern += '%s'
  31.         self.__insert_list = list()
  32.         new_args = dict(zip(fields, [None for field in fields]))
  33.         self.__make_add_record_function(new_args, fields)
  34.  
  35.     def query(self) -> str:
  36.         return 'INSERT INTO {} ({}) VALUES ({})'.format(self.__table, self.__fields, self.__values_pattern)
  37.  
  38.     def __make_add_record_function(self, arguments, col_list):
  39.  
  40.         @customizable_args(arguments)
  41.         def add_record(self, **kwargs):
  42.             for col in col_list:
  43.                 self.__insert_list.append(kwargs[col])
  44.  
  45.         setattr(self.__class__, add_record.__name__, add_record)
  46.  
  47.     def insert(self):
  48.         return self.__insert_list
  49.  
  50.  
  51. statement1 = InsertQuery('cert_info', ['issuer', 'subject', 'started', 'expires'])
  52. statement2 = InsertQuery('cert_info', ['issuer', 'subject', 'started', 'expires'])
  53.  
  54. statement1.add_record(issuer='hiu', subject='weweqe', expires='zavtra')
  55. statement2.add_record(issuer='lio', subject='iopiop', )
  56. print(statement1.insert())
  57. print(statement2.insert())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement