[Tutor] Functional Programming in Python
Steven D'Aprano
steve at pearwood.info
Fri Apr 3 05:23:31 CEST 2015
On Thu, Apr 02, 2015 at 03:36:17PM -0400, WolfRage wrote:
> On 04/02/2015 02:07 PM, Steven D'Aprano wrote:
> <SNIP>
> >>What are the best practices to create more Functional Python?
> >
> >Best practices:
> >
> >* Don't force your code to use one style exclusively. Use the most
> > natural style for the task. Python makes it easy to mix functional,
> > procedural, imperative and object oriented code in the one
> > application. Use whatever is most natural for your task.
>
> Good point, but still trying to understand how this is best determined
> beyond trial and error, and to make sure that my assumptions are correct
> about this decision.
Practice and experience!
> >* Where possible, write your functions and methods in a functional
> > style. That means:
> >
> >- Avoid global variables.
>
> I have got this down.
Just for the record, not all use of globals is bad. In my previous
reply to Danny, I gave an example of "late binding" for a default
parameter. In general, global constants, or near constants (e.g. you
write to the variable once when your application starts up, perhaps
after reading the value from a config file) are acceptable.
> >- Avoid side-effects where possible.
>
> Now getting better at this.
In object-oriented code, "side-effects" of course refers to side-effects
outside of the object itself. An object is allowed to manipulate its own
state.
However, even in OO code, it is very useful to avoid side-effects. For
example, the object might be immutable, so once it is initialised it
cannot be changed. Even if your object is mutable, you should cleanly
separate mutator methods which can modify the object from side-effect
free methods which do not.
E.g. it is okay for list.sort() to mutate the list, but list.index()
should not!
--
Steve
More information about the Tutor
mailing list