2009-09-17 7 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)) 

Comment puis-je transformer ce qui précède en fonction où je passe le nom de la classe? Dans l'exemple ci-dessus, Subscriber (dans l'instruction Subscriber.all(). Fetch) est un nom de classe, qui est la manière dont vous définissez les tables de données dans Google BigTable avec Python.Python: Passer un nom de classe en tant que paramètre à une fonction?

Je veux faire quelque chose comme ceci:

 TestRetrievalOfClass(Subscriber) 
or  TestRetrievalOfClass("Subscriber") 

Merci, Neal Walters

Répondre

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

Cool, je ne savais pas que vous pourriez passer une classe comme une autre variable. Il me manquait cette connexion. – NealWalters

+7

fonctions, méthodes, classe, modules tout est un objet de première classe en python que vous pouvez passer autour –

10

Si vous passez l'objet de classe directement, comme dans votre code entre "comme ça" et " ou ", vous pouvez obtenir son nom en tant qu'attribut __name__.

En commençant par le nom (comme dans votre code après « ou »), il est vraiment difficile (et non sans ambiguïté) pour récupérer l'objet de classe, sauf si vous avez une indication sur l'endroit où l'objet de classe peut être contenue - si pourquoi ne pas passer l'objet de classe à la place ?!

+1

+1: Les classes sont des objets de première classe - vous pouvez les assigner à des variables et paramètres et tout. Ce n'est pas C++. –

+0

OBJ = globals() [className]() où className est la variable contenant la chaîne du nom de la classe. Vous avez ce à partir d'un ancien poste ici: http://www.python-forum.org/pythonforum/viewtopic.php?f=3&t=13106 – NealWalters

+1

@NealWalters, qui ne fonctionnera pas si la classe est définie nulle part ailleurs que sur le dessus -level dans le module courant (dans une fonction, dans une autre classe, dans un autre module, etc.), donc pas une bonne idée en général. –

1

Une légère variation du code de Ned que je. C'est une application web, donc je la lance en lançant la routine get via une URL: http://localhost:8080/TestSpeedRetrieval. Je n'ai pas vu le besoin 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) 

Sortie:

Subscriber count=11 Duration=0:2 
_AppEngineUtilities_SessionData count=14 Duration=0:1 
CustomLog count=5 Duration=0:2 
Questions connexes