__init__ с использованием метода v лямбда - PullRequest
0 голосов
/ 26 июня 2018

При инициализации атрибута в классе, есть ли причина избегать использования лямбда-выражения или понимания списка, предпочитая метод или наоборот?

В примере: С

class Foo():
    def __init__(self, data):
        self.data = data

Понимание списка

class BarListComp():
    def __init__(self, listOfFoo):
        self.data = [fooInst.data for fooInst in listOfFoo if fooInst.data % 2 == 0]

Lambda

class BarLambda():
    def __init__(self, listOfFoo):
        self.data = list(filter(lambda x: x % 2 == 0, map(lambda y: y.data, listOfFoo)))

Метод

class BarMethod():

    def __init__(self, listOfFoo):
        self.data = self.genData(listOfFoo)

    @static_method
    def genData(listOfFoo):
        # this could also just be the earlier list comprehension
        listOut = []
        for elem in listOfFoo:
            if elem.data % 2 == 0:
                listOut.append(elem.data)
        return listOut

(Обратите внимание, что это могут быть не самые лучшие примеры, а необходимая обработка может быть гораздо более сложной)

Есть ли предпочтительный метод? Достигает ли процесс инициализации подходящей сложности, требующей разделения нового метода?

1 Ответ

0 голосов
/ 26 июня 2018

Просто чтобы добавить к @NPE комментарий (потому что я действительно согласен с его утверждением),

есть ли причина избегать использования лямбда-выражения или списка, предпочитая метод или наоборот?

Ответ - Да и Нет.

Мой неоднозначный ответ является следствием реальности: выбирайте, какой из них более читабелен для вашего конкретного случая .

Теперь, в сторону мнения, для вашего приведенного выше примера, я думаю, вряд ли можно утверждать, что ваше лямбда-решение будет одобрено. На первый взгляд, было бы трудно действительно понять, что происходит. Поэтому я бы сказал, выбрать опцию метода или понимание списка (что будет моим решением GOTO).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...