New submission from Martin Häcker <[email protected]>:
Code that uses higher order methods is often the clearest description of what
you want to do. However since the higher order methods in python (filter, map,
reduce) are free functions and aren't available on collection classes as
methods, using them creates really hard to read code.
For example, if I want to get an attribute out of an array of objects and
concatenate the results it's two steps, get the attributes out of the object,
then concatenate the results.
Without higher order methods its like this. Uses three lines, intermediate
variable is quite clear, but hard to compose and hard to abstract out parts of
it.
self.questions = []
for topic in self.topics:
self.questions.append(topic.questions)
if I want to do it with higher order functions there's really two ways, do it
in one step with reduce:
self.questions = reduce(lambda memo, topic: memo + topic.questions,
self.topics, [])
Or use two steps with the operator module
self.questions = reduce(operator.add, map(operator.attrgetter('questions'),
self.topics), [])
Of these thee first still couples two steps into one lambda, while the second
one decoples everything nicely but is a total train wreck to read, as you need
to constantly jump back and forth in the line to understand what it does.
Having map and reduce defined on collections would not only make it drastically
shorter but also allows you to read it from front to back in one go. (Ok, there
is still the caveat that the assignment is in the front instead of at the end,
but hey)
self.questions = self.topics.map(attrgetter('questions')).reduce(add, [])
That would be nicely separated into individual steps that exactly describe what
each step is actually doing, is easy to abstract over and actually very
succinct.
----------
messages: 151435
nosy: dwt
priority: normal
severity: normal
status: open
title: Python library structure creates hard to read code when using higher
order functions
type: enhancement
_______________________________________
Python tracker <[email protected]>
<http://bugs.python.org/issue13804>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com