The pythonic way is not checking the type of the object at all. For one the language is complicated enough that you'll have a hard time making sure to not include any objects that will fail later anyhow (obvious example from your post: You don't check whether the function takes 0 arguments, don't even think about the return type), and - even worse - you can easily exclude valid code by mistake.
It is much better to just assume the input values will be ok and fail later if it turns out they're not.
There is really only one exception: Say you have different code paths for different types (say strings/lists), in this case you have to check the type to decide which path to take. But again: Try the most general check that will work for you (i.e. don't check isinstance(l, list)
if isinstance(l, collections.Iterable)
would also do the job). If it later turns out the "string" wasn't really stringy enough you can always fail then.