Подтвердить что ты не робот

Python: передача имени класса в качестве параметра функции?

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)) 

Как я могу превратить приведенное выше в функцию, где я передаю имя класса? В приведенном выше примере Subscriber (в заявлении Subscriber.all(). Fetch) является именем класса, которое определяет таблицы данных в Google BigTable с помощью Python.

Я хочу сделать что-то вроде этого:

       TestRetrievalOfClass(Subscriber)  
or     TestRetrievalOfClass("Subscriber")  

Спасибо, Нил Уолтерс

4b9b3361

Ответ 1

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)  

Ответ 2

Если вы передаете объект класса напрямую, как в вашем коде между "like this" и "or", вы можете получить его имя как атрибут __name__.

Начиная с имени (как в вашем коде после "или" ) делает его ДЕЙСТВИТЕЛЬНО твердым (и не однозначным) для извлечения объекта класса, если у вас нет указания о том, где объект класса может содержаться - так почему бы не пройти объект класса вместо?!

Ответ 3

Небольшое изменение кода Ned, который я использовал. Это веб-приложение, поэтому я запускаю его, запустив процедуру get через URL-адрес: http://localhost:8080/TestSpeedRetrieval. Я не видел необходимости 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) 

Выход:

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