
On Tue, Sep 29, 2015 at 8:56 AM, Paul Moore <p.f.moore@gmail.com> wrote:
But it's not quite as obvious with multiple arguments where the target isn't the same as the parameter (for example with a constructor):
def __init__(self, vertices=None, edges=None, weights=None, source_nodes=None): if vertices is None: self.vertices = [] else: self.vertices = vertices if edges is None: self.edges = [] else: self.edges = edges if weights is None: self.weights = {} else: self.weights = weights if source_nodes is None: self.source_nodes = [] else: self.source_nodes = source_nodes
Personally I usually keep the defaults handling separate, like so: def __init__(self, vertices=None, edges=None, weights=None, source_nodes=None): if vertices is None: vertices = [] if edges is None: edges = [] if weights is None: weights = {} if source_nodes is None: source_nodes = [] self.vertices = vertices self.edges = edges self.weights = weights self.source_nodes = source_nodes ...and given the alternatives presented here, I'd likely continue doing so. To me the others are less distinct about how defaults are set and invite more churn if you have to do anything extra down the road when composing a default. Regardless, YMMV. [snip]
In practice, of course, I never write a default() function at the moment, I just use multi-line ifs. Whether that means I'd use an or? operator, I don't know. Probably - but I'd likely consider it a bit of a "too many ways of doing the same thing" wart at the same time...
Right. And it doesn't really pay for itself when measured against that cost. -eric