They are all mapping functions, though. You have a key 'k', which is accepted by d and will return a unique result. Why should I have to care whether d is a collection, object, or method? In fact in many cases it's pretty easy to implement all three.
class months(object):
def __init__(self):
m='jan feb mar apr may jun jul aug sep oct nov dec'.split(' ')
n=range(1,13)
self.__dict__.update(dict(zip(m,n)))
def __getitem__(self, key):
return self.__dict__[key]
def __call__(self, key):
return self.__dict__[key]
d=months()
print d['jan'] # 1
print d('jan') # 1
print d.jan # 1