Is it ok to type check a boolean argument?

Philip Semanchuk philip at semanchuk.com
Wed Jan 7 12:59:34 EST 2009


On Jan 7, 2009, at 12:24 PM, Adal Chiriliuc wrote:

> Hello,
>
> Me and my colleagues are having an discussion about the best way to
> code a function (more Pythonic).
>
> Here is the offending function:
>
> def find(field, order):
> ....if not isinstance(order, bool):
> ........raise ValueError("order must be a bool")
> ....order_by = "asc" if order else "desc"
> ....return _find(field + "+" + order_by)
>
> We are not sure what's the best practice here. Should we or should we
> not check the type of the "order" variable, which should be a bool?

IMHO you should not.

> The pro argument was that if a new programmer comes and passes a
> wrongly typed argument, he will get a silent failure.

"Wrongly typed" is a matter of opinion. The following values also  
evaluate to False when converted to bool:
None
[]
()
""
{}

To me, they're just as false as False is, if you catch my meaning. I  
would not like to have to convert them to bool to be able to use them  
when calling your function.

Imagine this scenario --

    order = read_order_from_preferences_xml_file(default_value = None)

    # order is now "ascending" or None

    find(the_field_name, order)


It seems logical to pass a string or None in this case without  
converting them to bool.

You might feel more comfortable if the parameter was called  
"is_ordered", which would at least imply that it is a boolean so that  
someone unfamiliar with the interface would be less tempted to pass  
something like the last part of an ORDER BY statement, like  
"last_name, first_name, age DESC".

I can understand your temptation to enforce bool-ness, but you have a  
very good point about this one function then being different from all  
of the others that aren't as picky.

HTH
Philip








More information about the Python-list mailing list