Background
A few weeks ago, I completed a technical test in Python. While the overall feedback from the test was very positive, one of the things I was surprised to read in the feedback was:
No encapsulation – plenty of public_functions which should be _private_functions
This surprised me because - according to the vague picture I'd built up in the back of my mind over my two years as a Python developer - we don't really do private methods or functions in Python. All that we do have is a patchwork of conventions, shorthand and gentleman's agreements. But is that picture in the back of my mind correct?
Underscores and Double Underscores
So I've looked into the matter a little more deeply, consulting the standard Python documentation as well as PEP 8, and I've come to the following conclusions:
- The use of a double underscore before a class attribute invokes name mangling, i.e.
__spamwill be interpreted as_classname__spam. This can be used to emulate a crude kind of privacy, such that if one tries to call__spamfrom outside of its class, an exception will be raised. - The programmer can use a single underscore to indicate that a function (or similar) is private, but this seems to have little syntactic effect. PEP 8 mentions that
_single_leading_underscorewill not be imported whenfrom M import *is called, but I couldn't find anything else.
However, this only tells me what I could do, not what I should do.
What I Want to Know
Can I write off the above feedback as coming from someone who's probably spent his professional life programming in Java/C#/etc, and therefore doesn't have the correct mindset when it comes to encapsulation in Python? Or should I re-think the way I write Python programs, so that any encapsulation is much more explicit?