Python __使用方法v lambda初始化

Python __使用方法v lambda初始化,python,methods,lambda,initialization,list-comprehension,Python,Methods,Lambda,Initialization,List Comprehension,在初始化类中的属性时,是否有理由避免使用lambda表达式或列表理解,而首选方法,反之亦然 例如: 与 列表理解 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, li

在初始化类中的属性时,是否有理由避免使用lambda表达式或列表理解,而首选方法,反之亦然

例如: 与

列表理解

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
(请注意,这些可能不是最好的例子,所需的处理可能要复杂得多)


有没有更好的方法?初始化过程是否达到了需要拆分新方法的适当复杂性?

只需添加到@NPE注释中(因为我确实同意他的说法)

是否有理由避免使用lambda表达式或列表理解,而更倾向于使用方法,反之亦然

答案是肯定和否定

我模棱两可的回答是现实存在的结果,选择wathever更适合你的具体案例


现在,观点补充说,对于你上面的例子,我认为你的Lambda解决方案很难得到支持。乍一看,很难真正了解正在发生的事情。因此,我建议选择方法选项或列表理解(这将是我的GOTO解决方案)。

我的经验法则是:设身处地地为不熟悉代码的读者着想,你的方法
genData
应该是
@staticmethod
或类外函数。@PatrickHaugh你关于静态的看法是对的,更新了
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