On 7/28/19 8:25 PM, Chris Angelico wrote: > On Mon, Jul 29, 2019 at 10:15 AM Richard Damon <rich...@damon-family.org> > wrote: >> On 7/28/19 7:46 PM, Michael Torrie wrote: >>> On 7/28/19 5:55 AM, Jonathan Moules wrote: >>>> But this appears to be explicitly called out as being "Worse" in PEP8: >>>> >>>> """ >>>> Don't compare boolean values to True or False using ==. >>>> >>>> Yes: if greeting: >>>> No: if greeting == True: >>>> Worse: if greeting is True: >>>> """ >>> Yet the recommended solution to the problem of wanting a default >>> argument of an empty list is something like this: >>> >>> def foo(bar=False); >>> if bar is False: >>> bar = [] >>> >>> .... >>> >>> Clearly in this case the expression "not bar" would be incorrect. >>> >>> There's a difference between looking for a particular identity or >>> sentinel, and checking for truthiness or falsiness. >>> >>> So I guess it all depends on what you need to do. If you just need to >>> check truthiness, just do "if greeting" If you need to know if the >>> variable is some particular sentinel, use the "if greeting is whatever". >> I thought the recommended value was None, not False (so you don't need >> to ask why not True). I suppose if None is a valid value for the input >> you would need something else, and False is one possibility. >> > In that situation, you'd be more likely to use a dedicated sentinel object: > > _SENTINEL = object() > def foo(bar=_SENTINEL): > if bar is _SENTINEL: bar = [] > > But there is a not-too-rare situation where you'd want to check if > something "is False", and that's some form of three-valued logic, eg > "true, false, and unspecified". For instance: > > def foo(verbose=None): > if verbose is False: > # caller specifically wanted quiet mode > > if verbose is True: > # caller specifically wanted verbose mode > > Of course, if the third value can be simplified away (eg None means > "use the global default"), then you can still just use "if verbose is > None:" and then reassign it. But this is a legit reason to use "is > False". > > ChrisA
The more common way to handle the 3 value case in my experience is to first handle the 'special case' (check for None in your example) and then use the normal truthiness test. Then you example would be: def foo(verbose=None): if verbose is None: # Didn't specify verbosity elif verbose: # Specified Verbose case else: # Specified none Verbose case Do you REALLY mean that foo(0) is to be different than foo(false)? -- Richard Damon -- https://mail.python.org/mailman/listinfo/python-list