2009-09-17 72 views
24
class TestSpeedRetrieval(webapp.RequestHandler): 
    """ 
    Test retrieval times of various important records in the BigTable database 
    """ 
    def get(self): 
     commandValidated = True 
     beginTime = time() 
     itemList = Subscriber.all().fetch(1000) 

     for item in itemList: 
      pass 
     endTime = time() 
     self.response.out.write("<br/>Subscribers count=" + str(len(itemList)) + 
      " Duration=" + duration(beginTime,endTime)) 

¿Cómo puedo convertir lo anterior en una función donde paso el nombre de la clase? En el ejemplo anterior, el suscriptor (en la instrucción Subscriber.all(). Fetch) es un nombre de clase, que es cómo se definen las tablas de datos en Google BigTable con Python.Python: ¿Pasar un nombre de clase como parámetro a una función?

quiero hacer algo como esto:

 TestRetrievalOfClass(Subscriber) 
or  TestRetrievalOfClass("Subscriber") 

Gracias, Neal Walters

Respuesta

17
class TestSpeedRetrieval(webapp.RequestHandler): 
    """ 
    Test retrieval times of various important records in the BigTable database 
    """ 
    def __init__(self, cls): 
     self.cls = cls 

    def get(self): 
     commandValidated = True 
     beginTime = time() 
     itemList = self.cls.all().fetch(1000) 

     for item in itemList: 
      pass 
     endTime = time() 
     self.response.out.write("<br/>%s count=%d Duration=%s" % (self.cls.__name__, len(itemList), duration(beginTime,endTime)) 

TestRetrievalOfClass(Subscriber) 
+0

fresca, yo no sabía que podría pasar una clase al igual que cualquier otra variable. Me estaba perdiendo esa conexión. – NealWalters

+7

funciones, métodos, clase, módulos todo es un objeto de primera clase en python que puede pasar por –

10

Si pasa el objeto de clase directamente, como en el código entre "así" y " o ", puede obtener su nombre como el atributo __name__.

Comenzando con el nombre (como en el código de después "o") hace que sea muy difícil (y no ambigua) para recuperar el objeto de clase a menos que tenga alguna indicación acerca de dónde la clase de objeto puede estar contenido - por lo ¿por qué no pasar el objeto de clase en su lugar?

+1

+1: las clases son objetos de primera clase; puede asignarlas a variables y parámetros, y todo. Esto no es C++. –

+0

OBJ = globals() [className]() donde className es la variable que contiene la cadena del nombre de la clase. Obtuve esto de una publicación anterior aquí: http://www.python-forum.org/pythonforum/viewtopic.php?f=3&t=13106 – NealWalters

+1

@NealWalters, eso no funcionará si la clase se define en cualquier otro lugar que en la parte superior -nivel en el módulo actual (en una función, en otra clase, en otro módulo, etc.), por lo que no es una buena idea en general. –

1

Una pequeña variación del código de Ned que utilicé. Esta es una aplicación web, , así que la inicio ejecutando la rutina get a través de una URL: http://localhost:8080/TestSpeedRetrieval. No vi la necesidad de init.

class TestSpeedRetrieval(webapp.RequestHandler): 
    """ 
    Test retrieval times of various important records in the BigTable database 
    """ 
    def speedTestForRecordType(self, recordTypeClassname): 
     beginTime = time() 
     itemList = recordTypeClassname.all().fetch(1000) 
     for item in itemList: 
      pass # just because we almost always loop through the records to put them somewhere 
     endTime = time() 
     self.response.out.write("<br/>%s count=%d Duration=%s" % 
     (recordTypeClassname.__name__, len(itemList), duration(beginTime,endTime))) 

    def get(self): 

     self.speedTestForRecordType(Subscriber) 
     self.speedTestForRecordType(_AppEngineUtilities_SessionData) 
     self.speedTestForRecordType(CustomLog) 

Salida:

Subscriber count=11 Duration=0:2 
_AppEngineUtilities_SessionData count=14 Duration=0:1 
CustomLog count=5 Duration=0:2 
Cuestiones relacionadas