The principle of duck typing says that you shouldn't care what type of object you have - just whether or not you can do the required action with your object. For this reason the
isinstance
keyword is frowned upon. - -Definition
In below snippet(function) group_tweets_by_state
, following definition of duck typing, action setdefault
is performed on the object tweets_by_state
by appending object tweet
def group_tweets_by_state(tweets):
tweets_by_state = {}
USA_states_center_position = {n: find_center(s) for n, s in us_states.items()}
for tweet in tweets: # tweets are list of dictionaries
if hassattr(tweet, 'setdefault'): # tweet is a dictionary
state_name_key = find_closest_state(tweet, USA_states_center_position)
tweets_by_state.setdefault(state_name_key, []).append(tweet)
return tweets_by_state
My understanding is, function hasattr(tweet, 'setdefault')
is type checking tweet
to be of <class 'dict'>
type in duck typing style, before append.
Is my understanding correct? Does function group_tweets_by_state
follow duck typing?
setdefault
if you're not going to use it. If you want to know whether it's a dict, useisinstance
, that's what it's for. – RemcoGerlich Jun 26 '15 at 10:08isinstance
is not duck typing. – overexchange Jun 26 '15 at 10:09tweets
is iterable and that its elements behave as dicts. They need not bedict
s, they can beOrderedDict
s for all you care. – avakar Jun 26 '15 at 10:14