It's me said:
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