It's me wrote:
For this code snip:

a=3
....
b=(1,len(a))[isinstance(a,(list,tuple,dict))]

Why would I get a TypeError from the len function?

You're looking for lazy evaluation or short-circuiting behavior. Python provides one form of short circuiting behavior with 'and' and 'or', though you need to be careful. In your particular circumstances, you could write this code as:


b = not isinstance(a, (list, tuple, dict)) and 1 or len(a)

Some example code:

py> def b(a):
...     return not isinstance(a, (list, tuple, dict)) and 1 or len(a)
...
py> b(3)
1
py> b([])
0
py> b([3, 4])
2

Note however that, due to how 'and' and 'or' short-circuit, you cannot write your code as:

b = isinstance(a, (list, tuple, dict)) and len(a) or 1

because when len(a) is 0, 1 will be returned instead of 0:

py> def b(a):
...     return isinstance(a, (list, tuple, dict)) and len(a) or 1
...
py> b(3)
1
py> b([])
1
py> b([3, 4])
2

If you want lazy evaluation, you can do this with lambdas (though I wouldn't advise it):

b = (lambda: 1, lambda: len(a))[isinstance(a,(list,tuple,dict))]()

Note that I select which function using isinstance as you have before, and then invoke the selected function with the final ().

Steve
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to