Dreaming of new generation IDE

Steven D'Aprano steve at REMOVE-THIS-cybersource.com.au
Fri Feb 5 18:29:10 EST 2010


On Fri, 05 Feb 2010 22:22:39 +0000, bartc wrote:

> "Steve Holden" <steve at holdenweb.com> wrote in message
> news:mailman.1998.1265399766.28905.python-list at python.org...
>> Arnaud Delobelle wrote:
>>> Robert Kern <robert.kern at gmail.com> writes:
>>>
>>>> I prefer Guido's formulation (which, naturally, I can't find a direct
>>>> quote for right now): if you expect that a boolean argument is only
>>>> going to take *literal* True or False, then it should be split into
>>>> two functions.
>>>
>>> So rather than three boolean arguments, would you have eight
>>> functions?
>>>
>> If there's genuinely a need for that functionality, yes.
> 
> So you want a function such as drawtext(s, bold=true, italic=false,
> underline=true) to be split into:
> 
> drawtext(s)
> drawtextb(s)
> drawtexti(s)
> drawtextu(s)
> drawtextbi(s)
> drawtextbu(s)
> drawtextiu(s)
> drawtextbiu(s)


No, of course not. But one might prefer a function with an alternate API, 
such as:

style = TextStyle(bold=True, underline=True, size=12, font='helvetica')
drawtext(s, style)
style.italic = True
drawtext(s, style)

Other alternatives might be to pass the style information as a string 
"BU" (bold underline) or a numeric flag (BOLD & UNDERLINE).

In general, if your implementation looks like this:


def function(args, flag):
    if flag:
        do_this()
    else:
        do_that()


then this is a good candidate for splitting into multiple functions.

Likewise:

def function(args, flag):
    result = do_this()
    if flag:
        result = modify(result)
    return result

or similar.

The point is that such a function uses the flag to select between two 
different semantics. From a API perspective, it is generally better to 
make each behaviour an independent function (perhaps calling a third, 
private, function implementing any common behaviour). For example, 
instead of:

def extreme(sequence, biggest=True):
    """Return the extreme value from sequence.

    If biggest is a true value, return the maximum value, otherwise
    return the smallest.
    """
    pass  # implementation left as an exercise


have two functions, max and min.



-- 
Steven



More information about the Python-list mailing list