What are the differences between these two code fragments?
Using type():
import types
if type(a) is types.DictType:
do_something(
The latter is preferred, because it will handle subclasses properly. In fact, your example can be written even more easily because isinstance()'s second parameter may be a tuple:
if isinstance(b, (str, unicode)):
do_something_else()
or, using the basestring abstract class:
if isinstance(b, basestring):
do_something_else()