Base de datos simple en memoria -- python campo con database campo con python-2.x camp codereview Relacionados El problema

Simple in-memory database


3
vote

problema

Español

¿Cómo puedo mejorar este código (elegancia, mejores prácticas, etc.)?

  for i in {0..9}{a..z}{a..z}           {a..z}{0..9}{a..z}           {a..z}{a..z}{0..9}           {a..z}{a..z}{a..z}           {0..9}{0..9}{a..z}           {0..9}{a..z}{0..9}           {a..z}{0..9}{0..9}           {0..9}{0..9}{0..9}; do ... 3  
Original en ingles

How can I improve this code (elegance, best practices, etc)?

""" Simple in-memory database as a response to the Thumbtack coding challenge. """   class SimpleDb(object):      """ Simple in-memory database as a response to the Thumbtack coding challenge. """      def __init__(self):         """ Initialize SimpleDb instance. """         self.__db = {}         self.__num_equal_to_cache = {}         self.__transactions = []  # Stores previous values to allow rollback      def assign(self, name, value):         """ Sets value of name to value. Inserts name into database if it doesn't already exist. """         current_value = self.get(name)         if current_value == value:             return         self.__update_num_equal_to(current_value, value)         self.__update_current_transaction(name, current_value)         self.__db[name] = value      def get(self, name):         """ Returns value of name if it exists in the database, otherwise returns None. """         return self.__db[name] if name in self.__db else None      def get_num_equal_to(self, value):         """ Returns number of entries in the database that have the specified value. """         return self.__num_equal_to_cache[value] if value in self.__num_equal_to_cache else 0      def unset(self, name):         """ Removes name from database if it's present. """         current_value = self.__db.pop(name, None)         if current_value is None:             return         self.__update_num_equal_to(current_value)         self.__update_current_transaction(name, current_value)      def begin(self):         """ Opens transaction block. """         self.__transactions += [{}]      def rollback(self):         """         Reverts database to its state before most current transaction.         Returns True on success, returns False if there aren't any open transactions.         """         if not self.__transactions:             return False         for name, value in self.__transactions.pop().iteritems():             current_value = self.get(name)             if current_value == value:                 continue             self.__update_num_equal_to(current_value, value)             if value is None:                 del self.__db[name]             else:                 self.__db[name] = value         return True      def commit(self):         """         Commits all transactions to database. Returns True on success,         returns False if there aren't any open transactions.         """         if not self.__transactions:             return False         self.__transactions = []         return True      def __update_num_equal_to(self, current_value, new_value=None):         """         Decrements by one the number items present with current_value (if current_value         is not equal to None) and increments by one the number present with new_value         (if new_value is not equal to None).         """         for amount_to_add, value in [(-1, current_value), (1, new_value)]:             if value is not None:                 self.__num_equal_to_cache.setdefault(value, 0)                 self.__num_equal_to_cache[value] += amount_to_add      def __update_current_transaction(self, name, value):         """         Stores current value of name if not already stored to most recent transaction         (if any transactions open) to enable restoration of previous state on rollback.         """         if self.__transactions and name not in self.__transactions[-1]:             self.__transactions[-1][name] = value   def display(value, default=None):     """     Prints value to stdout. If value is None and a default value is     specified (and not None), then the default value is printed instead. Otherwise     the None value is printed.     """     if value is None and default is not None:         value = default     print value   OPS = {         'GET':        (2, lambda db, name:  display(db.get(name), "NULL")),         'NUMEQUALTO': (2, lambda db, value: display(db.get_num_equal_to(value))),         'UNSET':      (2, lambda db, name:  db.unset(name)),         'BEGIN':      (1, lambda db:        db.begin()),         'ROLLBACK':   (1, lambda db:        db.rollback() or display("NO TRANSACTION")),         'COMMIT':     (1, lambda db:        db.commit() or display("NO TRANSACTION")),         'END':        (1, lambda db:        False),         'SET':        (3, lambda db, name, value: db.assign(name, value)), }   def process_command(simpleDb, command):     """     Parses string commands and applies them to the database.     Returning False indicates that no more commands should be passed in.     """     command = command.split()     opcode = command.pop(0).upper() if len(command) > 0 else None     if opcode is None or opcode not in OPS or len(command) != (OPS[opcode][0] - 1):         print "INVALID COMMAND"     elif 'END' == opcode:         return False     else:         OPS[opcode][1](simpleDb, *command)     return True   def run():     """ Reads database command from the command line and passes it through for processing. """     # BEGIN \n SET a 30 \n BEGIN \n SET a 40 \n COMMIT \n GET a \n ROLLBACK \n END     simpleDb = SimpleDb()     while process_command(simpleDb, raw_input()):         pass  run() 
        
   
   

Lista de respuestas

5
 
vote

Encuentro tu tratamiento de transacciones extrañas. Espero que cuando una transacción esté en curso, los comandos de modificaciones de datos se almacenan en búfer; Las consultas consultarían al Estado almacenado en la transacción actual para los datos relevantes, luego cualquier transacción apilada, luego consultando finalmente la base de datos "real". En su lugar, inmediatamente "automatiza automáticamente" cada comando, y agregue una entrada a la lista de deshacer; Un compromiso simplemente descarta la lista de deshacer. Eso no es un modelo realista de una base de datos: uno esperaría que un compromiso tenga éxito atómicamente o no tiene efecto en absoluto en la base de datos.

 

I find your treatment of transactions odd. I would expect that when a transaction is in progress, data modifications commands get buffered; queries would consult the state stored in the current transaction for any relevant data, then any stacked transactions, then finally consulting the "real" database. Instead, you immediately "auto-commit" each command, and add an entry to the undo list; a commit simply discards the undo list. That's not a realistic model of a database: one would expect that a commit either succeeds atomically or has no effect at all on the database.

 
 
         
         

Relacionados problema

1  Una clase con un puntero de función en lugar de un generador  ( A class with a function pointer instead of a generator ) 
Estoy construyendo archivos Tikz, un PDF para cada imagen que tengo. El propósito es agregar texto a cada uno por separado. Las imágenes son LEGION, así que c...

6  Comprobando una cuadrícula de palabras  ( Checking a word grid ) 
Escribí este programa donde puede ingresar x cantidad de palabras que de longitud x que comprueba si la cuadrícula se formó son las mismas palabras vertic...

4  Uso eficiente de la expresión regular y la manipulación de cadenas  ( Efficient use of regular expression and string manipulation ) 
La siguiente es mi solución a java vs c ++ . Creo que la forma en que he usado, la biblioteca de RE es ineficiente, y es posible erróneas, ya que estoy obten...

1  Foldify - Una herramienta de carpeta de Python Tree Tree  ( Foldify a python folder tree manager tool ) 
El objetivo era crear una herramienta para ayudar a administrar las estructuras de las carpetas y permitirme crear plantillas de estas carpetas y almacenarlas...

3  Usuario rápido para algunos números, luego imprime el máximo y min  ( Prompt user for some numbers then print the max and min ) 
La función de este programa está solicitando repetidamente a un usuario para números enteros hasta que el usuario ingrese en 'done' . Una vez que se ingresa ...

2  Dos formas de aleatorias aleatoriamente las tarjetas  ( Two ways to randomly shuffle cards ) 
Aquí hay dos implementaciones que escribí para aleatorizar las tarjetas. El primer método ( dt5 ) Selecciona una tarjeta aleatoria, luego lo quita al frent...

4  Atomas Clone en Python  ( Atomas clone in python ) 
Aquí está mi clon de mierda de atomas , un juego de rompecabezas donde combina pequeños átomos en otros más valiosos. 9988776655544337 ¿Hay algún códig...

10  Protocolo de red usando TCP, enviando imágenes a través de sockets  ( Network protocol using tcp sending images through sockets ) 
Me gustaría preguntar sobre su opinión sobre mi código. La idea es simple: diseñé mi propio protocolo, donde el cliente le pregunta al servidor sobre la image...

6  Valores coincidentes de la tabla HTML para actualizar los valores en Pandas DataFrame  ( Matching values from html table for updating values in pandas dataframe ) 
Esto es más un ejercicio para que me utilice a Pandas y sus cuadros de datos. Para aquellos que no escucharon de él: Panda es un paquete de Python que prop...

3  Seleccione Quick - Shuffle para hacer una clasificación más rápida  ( Quick select shuffle to make sorting faster ) 
Estoy tratando de usar el shuffle para mejorar el peor caso del escenario de selección rápida (por ejemplo, cada vez, el valor de pivote seleccionado es el má...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos