Применение функции map к вызову метода OO

#python #python-3.x #oop

Вопрос:

Мне интересно, могу ли я использовать встроенную функцию Python map (написанную на C) для замены цикла for, который в настоящее время содержит вызов метода экземпляра класса.

Следующий код представляет собой тонкий шаблон того, как выглядит часть класса. Внешний по отношению к этому классу, мы вызываем метод buildPatientsFromPatid , который перебирает записи из списка строк, вызывает встроенный частный метод __buildPatientFromPatid , который возвращает patient_instance (экземпляр класса Patient), который немедленно передается встроенному методу цикла for addPatient для добавления в patients объект.

 class some_class():   def __buildPatientFromPatid(self, patidStr, featureList):  # do something  # ....  return patient_instance    def buildPatientsFromPatid(self, patidList, featureList) -gt; Patients:  # go through each patidList entry, build a new Patient and assigned to a PatientsClass instance  patients = Patients()    for patidStr in patidList:  patients.addPatient(self.__buildPatientFromPatid(patidStr, featureList))   return patients  

Я предполагаю некоторые вариации на:

 patients = Patients()  patients= map(self.buildPatientFromPatid(lt;this_must_changegt;, featureList), patidList)  

Я просто не знаю, как это сделать.

Комментарии:

1. lambda patid: self.buildPatientFromPatid(patid, featureList) !?

2. Почему именно вы хотите использовать map ? Карты ленивы в Python — вам все равно придется перебирать/исчерпывать объект карты, чтобы фактически вычислить результаты.

3. Функция map вернет генератор. « карта(лямбда x:x, []) gt;gt;gt;gt;gt;gt; gt;gt;gt;lt;карта в 0x7fb549818b80gt; « и если вы не повторите ее, функция не будет выполнена. Я не думаю, что карта была бы хорошей идеей в этом случае. То, что вы делаете, кажется достаточно хорошим.

4. Вы не создаете список или другую последовательность значений, поэтому for цикл является подходящей конструкцией для простого повторения последовательности вызовов методов.

5. Все было бы по-другому, если бы вместо addPatient многократного вызова вы могли передавать соответствующий список непосредственно Patients.__init__ при первом создании объекта.