Can Python's map function call object member functions?

后端 未结 5 1779
無奈伤痛
無奈伤痛 2021-02-01 14:31

I need to do something that is functionally equivalent to this:

for foo in foos:
    bar = foo.get_bar()
    # Do something with bar

My first i

相关标签:
5条回答
  • 2021-02-01 14:35

    I think the cleanest way is to forgo the for-loop completely and use a list comprehension:

    bars = [foo.get_bar() for foo in foos]
    

    This answer is close to some other answers but differs in that the list is actually returned and not used in the subsequent loop. Depending on what you do with bars, you may be able to use a list comprehension there to.

    I don't think the map function with lambdas are particulary readable, besides the overhead for map is considerable.

    0 讨论(0)
  • 2021-02-01 14:36

    You want operator.methodcaller(). Or, of course, a list or generator comprehension.

    0 讨论(0)
  • 2021-02-01 14:38

    Either with lambda:

    for bar in map(lambda foo: foo.get_bar(), foos):
    

    Or simply with instance method reference on your instance's class:

    for bar in map(Foo.get_bar, foos):
    

    As this was added from a comment, I would like to note that this requires the items of foos to be instances of Foo (i.e. all(isinstance(foo, Foo) for foo in foos) must be true) and not only as the other options do instances of classes with a get_bar method. This alone might be reason enough to not include it here.

    Or with methodcaller:

    import operator
    get_bar = operator.methodcaller('get_bar')
    for bar in map(get_bar, foos):
    

    Or with a generator expression:

    for bar in (foo.get_bar() for foo in foos):
    
    0 讨论(0)
  • 2021-02-01 14:41

    You can use lambda

    for bar in map(lambda foo: foo.get_bar(), foos):
        # Do something with bar
    
    0 讨论(0)
  • 2021-02-01 14:53

    This modified code will work:

    for bar in map(lambda f: f.get_bar(), foos):
    # Do something with bar
    

    You provide lambda function here. Simply providing get_bar doesn't work because it is accessible only through an instance of class (f.get_bar()), never by itself.

    0 讨论(0)
提交回复
热议问题