understanding tweepy's status object

Question:

I’ve been working with tweepy streaming API and I have noticed one thing. The response of a status object is not pure JSON it has some additional information also. Here’s my question:

If I need the text content of a tweet, I have to do status.text which is inside the _json dictionary/ json object. But, if I need the the media, or the full text for example, I have to do status.entities['media'][0]['media_url_https'] or status.extended_tweet['full_text'], although both entities and extended_tweet are inside another dictionary in the _json object.

Why do we have to use the dot (.) notation to access outer dictionaries in the _json and the [] notation to access values in inner dictionaries?

I understand the [] notation but what does the dot notation mean?

status object:

Status(_api=<tweepy.api.API object at 0x7f6851708190>, _json={'created_at': 'Mon Feb 01 10:58:31 +0000 2021', 
'id': 1356195217687392256, 
'id_str': '1356195217687392256', 
'text': 'hiii IWD1FKPH0JEFS2PNH7KBSPXQ2EAZVORAWCE2580MWFW4N0OAFM63WI06CAZ4OYBLMPATC4VL9OAMFH86K660EXVMP53M36PN0FTU1ETKBIIP7D… , 
'display_text_range': [0, 140], 
'source': '<a href="https://mobile.twitter.com" rel="nofollow">Twitter Web App</a>', 
'truncated': True, 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'in_reply_to_screen_name': None, 
'user': {'id': 1355079285812453379, 'id_str': '1355079285812453379', 'name': 'db1-testing', 'screen_name': 'Db1Testing', 'location': None, 'url': None, 'description': None, 'translator_type': 'none', 'protected': False, 'verified': False, 'followers_count': 0, 'friends_count': 0, 'listed_count': 0, 'favourites_count': 0, 'statuses_count': 29, 'created_at': 'Fri Jan 29 09:04:24 +0000 2021', 'utc_offset': None, 'time_zone': None, 
'geo_enabled': False, 'lang': None, 'contributors_enabled': False, 
'is_translator': False, 'profile_background_color': 'F5F8FA', 'profile_background_image_url': '', 'profile_background_image_url_https': '', 'profile_background_tile': False, 'profile_link_color': '1DA1F2', 'profile_sidebar_border_color': 'C0DEED', 'profile_sidebar_fill_color': 'DDEEF6', 'profile_text_color': '333333', 'profile_use_background_image': True, 'profile_image_url': 'http://abs.twimg.com/sticky/default_profile_images/default_profile_normal.png', 'profile_image_url_https': 'https://abs.twimg.com/sticky/default_profile_images/default_profile_normal.png', 'default_profile': True, 'default_profile_image': False, 'following': None, 'follow_request_sent': None, 'notifications': None}, 'geo': None, 'coordinates': None, 'place': None, 'contributors': None, 'is_quote_status': False, 'extended_tweet': {'full_text': 'hiii IWD1FKPH0JEFS2PNH7KBSPXQ2EAZVORAWCE2580MWFW4N0OAFM63WI06CAZ4OYBLMPATC4VL9OAMFH86K660EXVMP53M36PN0FTU1ETKBIIP7DMBJ3XCQN2XXXA1KA6VSCW292X86SJGHWEH3L1J2HVLV42SHPV8LCVZYY6S762GJ2MOBF3J6IH0, 'display_text_range': [0, 189], 'entities': {'hashtags': [], 'urls': [], 'user_mentions': [], 'symbols': [], 'media': [{'id': 1356193076398731264, 'id_str': '1356193076398731264', 'indices': [190, 213], 'media_url': 'http://pbs.twimg.com/media/EtIqauWXMAAZsTn.jpg', 'media_url_https': 'https://pbs.twimg.com/media/EtIqauWXMAAZsTn.jpg',  'display_url': 'pic.twitter.com/BWiI8Lh6tW', 'expanded_url': 'https://twitter.com/Db1Testing/status/1356195217687392256/photo/1', 'type': 'photo', 'sizes': {'thumb': {'w': 150, 'h': 150, 'resize': 'crop'}, 'small': {'w': 680, 'h': 665, 'resize': 'fit'}, 'medium': {'w': 827, 'h': 809, 'resize': 'fit'}, 'large': {'w': 827, 'h': 809, 'resize': 'fit'}}}]}, 'extended_entities': {'media': [{'id': 1356193076398731264, 'id_str': '1356193076398731264', 'indices': [190, 213], 'media_url': 'http://pbs.twimg.com/media/EtIqauWXMAAZsTn.jpg', 
'media_url_https': 'https://pbs.twimg.com/media/EtIqauWXMAAZsTn.jpg', , 'display_url': 'pic.twitter.com/BWiI8Lh6tW', 'expanded_url': 'https://twitter.com/Db1Testing/status/1356195217687392256/photo/1', 'type': 'photo', 'sizes': {'thumb': {'w': 150, 'h': 150, 'resize': 'crop'}, 'small': {'w': 680, 'h': 665, 'resize': 'fit'}, 'medium': {'w': 827, 'h': 809, 'resize': 'fit'}, 'large': {'w': 827, 'h': 809, 'resize': 'fit'}}}]}}, 'quote_count': 0, 'reply_count': 0, 'retweet_count': 0, 'favorite_count': 0, 'entities': {'hashtags': [], 'urls': [{ 'expanded_url': 'https://twitter.com/i/web/status/1356195217687392256', 'display_url': 'twitter.com/i/web/status/1…', 'indices': [117, 140]}], 'user_mentions': [], 'symbols': []}, 'favorited': False, 'retweeted': False, 'possibly_sensitive': False, 'filter_level': 'low', 'lang': 'ht', 'timestamp_ms': '1612177111442'}, created_at=datetime.datetime(2021, 2, 1, 10, 58, 31), id=1356195217687392256, id_str='1356195217687392256', text='hiii IWD1FKPH0JEFS2PNH7KBSPXQ2EAZVORAWCE2580MWFW4N0OAFM63WI06CAZ4OYBLMPATC4VL9OAMFH86K660EXVMP53M36PN0FTU1ETKBIIP7D… , display_text_range=[0, 140], source='Twitter Web App', source_url='https://mobile.twitter.com', truncated=True, in_reply_to_status_id=None, in_reply_to_status_id_str=None, in_reply_to_user_id=None, in_reply_to_user_id_str=None, in_reply_to_screen_name=None, author=User(_api=<tweepy.api.API object at 0x7f6851708190>, _json={'id': 1355079285812453379, 'id_str': '1355079285812453379', 'name': 'db1-testing', 'screen_name': 'Db1Testing', 'location': None, 
'url': None, 
'description': None, 
'translator_type': 'none', 
'protected': False, 'verified': False, 
'followers_count': 0, 'friends_count': 0, 
'listed_count': 0, 'favourites_count': 0, 
'statuses_count': 29, 
'created_at': 'Fri Jan 29 09:04:24 +0000 2021', 
'utc_offset': None, 'time_zone': None, 
'geo_enabled': False, 'lang': None, 
'contributors_enabled': False, 
'is_translator': False, 
'profile_background_color': 'F5F8FA', 
'profile_background_image_url': '', 
'profile_background_image_url_https': '', 
'profile_background_tile': False, 
'profile_link_color': '1DA1F2', 
'profile_sidebar_border_color': 'C0DEED', 
'profile_sidebar_fill_color': 'DDEEF6', 
'profile_text_color': '333333', 
'profile_use_background_image': True, 
'profile_image_url': 'http://abs.twimg.com/sticky/default_profile_images/default_profile_normal.png', 'profile_image_url_https': 'https://abs.twimg.com/sticky/default_profile_images/default_profile_normal.png', 
'default_profile': True, 
'default_profile_image': False, 
'following': None, 'follow_request_sent': None, 
'notifications': None}, id=1355079285812453379, 
id_str='1355079285812453379', 
name='db1-testing', 
screen_name='Db1Testing', 
location=None, 
url=None, description=None, 
translator_type='none', 
protected=False, 
verified=False, 
followers_count=0, 
friends_count=0, 
listed_count=0, 
favourites_count=0, 
statuses_count=29, 
created_at=datetime.datetime(2021, 1, 29, 9, 4, 24), 
utc_offset=None,
time_zone=None, 
geo_enabled=False, 
lang=None, 
contributors_enabled=False, 
is_translator=False, 
profile_background_color='F5F8FA', 
profile_background_image_url='', 
profile_background_image_url_https='', 
profile_background_tile=False, 
profile_link_color='1DA1F2', 
profile_sidebar_border_color='C0DEED', 
profile_sidebar_fill_color='DDEEF6', 
profile_text_color='333333', 
profile_use_background_image=True, profile_image_url='http://abs.twimg.com/sticky/default_profile_images/default_profile_normal.png', profile_image_url_https='https://abs.twimg.com/sticky/default_profile_images/default_profile_normal.png', default_profile=True, 
default_profile_image=False, following=False, 
follow_request_sent=None, notifications=None), 
user=User(_api=<tweepy.api.API object at 0x7f6851708190>, 
_json={'id': 1355079285812453379, 'id_str': '1355079285812453379', 'name': 'db1-testing', 'screen_name': 'Db1Testing', 'location': None, 
'url': None, 'description': None, 'translator_type': 'none', 'protected': False, 'verified': False, 'followers_count': 0, 
'friends_count': 0, 
'listed_count': 0, 
'favourites_count': 0, 
'statuses_count': 29, 
'created_at': 'Fri Jan 29 09:04:24 +0000 2021', 
'utc_offset': None, 
'time_zone': None, 
'geo_enabled':False, 
'lang': None, 
'contributors_enabled': False, 
'is_translator': False, 
'profile_background_color': 'F5F8FA', 
'profile_background_image_url': '', 
'profile_background_image_url_https': '', 
'profile_background_tile': False, 
'profile_link_color': '1DA1F2', 
'profile_sidebar_border_color': 'C0DEED', 
'profile_sidebar_fill_color': 'DDEEF6', 
'profile_text_color': '333333', 
'profile_use_background_image': True, 
'profile_image_url': 'http://abs.twimg.com/sticky/default_profile_images/default_profile_normal.png', 'profile_image_url_https': 'https://abs.twimg.com/sticky/default_profile_images/default_profile_normal.png', 
'default_profile': True, 'default_profile_image': False, 'following': None, 'follow_request_sent': None, 'notifications': None}, id=1355079285812453379, id_str='1355079285812453379', name='db1-testing', screen_name='Db1Testing', location=None, url=None, description=None, translator_type='none', protected=False, verified=False, followers_count=0, 
friends_count=0, listed_count=0, favourites_count=0, statuses_count=29, created_at=datetime.datetime(2021, 1, 29, 9, 4, 24), utc_offset=None, time_zone=None,
geo_enabled=False, lang=None, 
contributors_enabled=False, 
is_translator=False, 
profile_background_color='F5F8FA', 
profile_background_image_url='', 
profile_background_image_url_https='', 
profile_background_tile=False, 
profile_link_color='1DA1F2', 
profile_sidebar_border_color='C0DEED', 
profile_sidebar_fill_color='DDEEF6', 
profile_text_color='333333', 
profile_use_background_image=True, profile_image_url='http://abs.twimg.com/sticky/default_profile_images/default_profile_normal.png', profile_image_url_https='https://abs.twimg.com/sticky/default_profile_images/default_profile_normal.png', default_profile=True, 
default_profile_image=False, following=False, 
follow_request_sent=None, notifications=None), geo=None, coordinates=None, place=None, contributors=None, is_quote_status=False, extended_tweet={
'full_text': 'hiii IWD1FKPH0JEFS2PNH7KBSPXQ2EAZVORAWCE2580MWFW4N0OAFM63WI06CAZ4OYBLMPATC4VL9OAMFH86K660EXVMP53M36PN0FTU1ETKBIIP7DMBJ3XCQN2XXXA1KA6VSCW292X86SJGHWEH3L1J2HVLV42SHPV8LCVZYY6S762GJ2MOBF3J6IH0 , 'display_text_range': [0, 189], 
'entities': {'hashtags': [], 'urls': [], 'user_mentions': [], 'symbols': [], 'media': [{'id': 1356193076398731264, 'id_str': '1356193076398731264', 'indices': [190, 213], 'media_url': 'http://pbs.twimg.com/media/EtIqauWXMAAZsTn.jpg', 'media_url_https': 'https://pbs.twimg.com/media/EtIqauWXMAAZsTn.jpg', , 'display_url': 'pic.twitter.com/BWiI8Lh6tW', 'expanded_url': 'https://twitter.com/Db1Testing/status/1356195217687392256/photo/1', 'type': 'photo', 'sizes': {'thumb': {'w': 150, 'h': 150, 'resize': 'crop'}, 'small': {'w': 680, 'h': 665, 'resize': 'fit'}, 'medium': {'w': 827, 'h': 809, 'resize': 'fit'}, 'large': {'w': 827, 'h': 809, 'resize': 'fit'}}}]}, 'extended_entities': {'media': [{'id': 1356193076398731264, 'id_str': '1356193076398731264', 'indices': [190, 213], 'media_url': 'http://pbs.twimg.com/media/EtIqauWXMAAZsTn.jpg', 'media_url_https': 'https://pbs.twimg.com/media/EtIqauWXMAAZsTn.jpg', , 'display_url': 'pic.twitter.com/BWiI8Lh6tW', 'expanded_url': 'https://twitter.com/Db1Testing/status/1356195217687392256/photo/1', 'type': 'photo', 'sizes': {'thumb': {'w': 150, 'h': 150, 'resize': 'crop'}, 'small': {'w': 680, 'h': 665, 'resize': 'fit'}, 'medium': {'w': 827, 'h': 809, 'resize': 'fit'}, 'large': {'w': 827, 'h': 809, 'resize': 'fit'}}}]}}, quote_count=0, reply_count=0, retweet_count=0, favorite_count=0, 
entities={'hashtags': [], 'urls': [{'expanded_url': 'https://twitter.com/i/web/status/1356195217687392256', 
'display_url': 'twitter.com/i/web/status/1…', 'indices': [117, 140]}], 'user_mentions': [], 
'symbols': []}, favorited=False, retweeted=False,
 possibly_sensitive=False, filter_level='low', lang='ht', timestamp_ms='1612177111442')

A Stackoverflow answer here suggests using status.extended_tweet.full_text but it doesn’t work until I do status.extended_tweet['full_text']

Asked By: stuckoverflow

||

Answers:

The main difference is that Tweepy has some predefined objects (Status, User) but often uses dictionaries (it is probably more flexible as the data model evolves).

The status.user is a User object, for example

print(type(status.user))  # <class 'tweepy.models.User'>
print(status.user.screen_name) # beppecatanese

The extended_tweet (when it exists) contains a dictionary of attributes, for example

print(type(status.extended_tweet)) # <class 'dict'>

The entities are arrays of various objects (hashtag. media, URL, etc..), again wrapped in a dictionary

print(type(tweet.entities))  # <class 'dict'>
print(tweet.entities['urls'][0]) # First url
print(type(tweet.entities['urls'][0]))  # <class 'dict'>
print(tweet.entities['urls'][0]['expanded_url']) # expanded url of first url
Answered By: Beppe C
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.