which is more 'pythonic' / 'better' ?
Steven Bethard
steven.bethard at gmail.com
Tue Sep 13 18:24:58 EDT 2005
Peter Hansen wrote:
> def meth(self, things=None):
> self.things = things or []
>
[snip]
>
> The alternative is fine too, but insisting on it would be pedantic, and
> if you have more than one of these it is definitely less readable (and,
> therefore, not Pythonic):
>
> def meth(self, things=None):
> if things:
> self.things = things
> else:
> self.things = []
Probably worth pointing out that there is at least one more alternative:
def meth(self, things=None):
if things is None:
things = []
self.things = things
I usually opt for this one, mainly because "things or []" makes me
nervous -- it has different behavior if the user passes in an empty list:
py> class Things1(object):
... def __init__(self, things=None):
... if things is None:
... things = []
... self.things = things
...
py> class Things2(object):
... def __init__(self, things=None):
... self.things = things or []
...
py> lst = []
py> thing = Things1(lst)
py> thing.things.append(100)
py> thing.things, lst
([100], [100])
py> lst = []
py> thing = Things2(lst)
py> thing.things.append(100)
py> thing.things, lst
([100], [])
That said, I do use "and" and "or" occasionally when I'm sure I don't
have to worry about complications like the above. I've probably even
used them in an assignment statement. ;)
STeVe
More information about the Python-list
mailing list