Search code examples
python-3.xtweepysupersuperclass

Tweepy StreamingClient custom __init__ / arguments - super() not working


I'm looking to stream tweets to json files. I'm using Twitter API v2.0, with Tweepy 4.12.1 and Python 3.10 on Ubuntu 22.04. I'm working with the tweepy.StreamingClient class, and utilizing the on_data() method.

class TweetStreamer(tweepy.StreamingClient):

    def __init__(self, 
                 out_path:str,
                 kill_time:int=59,
                 time_unit:str='minutes'):
        '''
        adding custom params
        '''
        out_path = check_path_exists(out_path)
        self.outfile = out_path 

        if time_unit not in ['seconds', 'minutes']:
            raise ValueError(f'time_unit must be either `minutes` or `seconds`.')

        if time_unit=='minutes':
            self.kill_time = datetime.timedelta(seconds=60*kill_time)
        else:
            self.kill_time = datetime.timedelta(seconds=kill_time)

        super(TweetStreamer, self).__init__()

    def on_data(self, data):
        '''
        1. clean the returned tweet object
        2. write it out
        '''
        # out_obj = data['data']

        with open(self.outfile, 'ab') as o:
            o.write(data+b'\n')

As you can see, I'm invoking `super() on the parent class, with the intention of retaining all the stuff that is invoked if I didn't specify a custom init.

However, however I try to change it, I get this error when I try to create an instance of the class, passing a bearer_token as well as the other arguments defined in __init__() :

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In [106], line 1
----> 1 streamer = TweetStreamer(bearer_token=bearer_token, out_path='test2.json')

TypeError: TweetStreamer.__init__() got an unexpected keyword argument 'bearer_token'

Any help would be greatly appreciated.


Solution

  • You get this error because you declared that __init__ does not take bearer_token as an argument. You need to pass the keyword arguments your constructor gets to the constructor of the superclass that is expecting them. You can do it using the unpacking operator **:

        def __init__(self, 
                 out_path:str,
                 kill_time:int=59,
                 time_unit:str='minutes',
                 **kwargs):
        '''
        adding custom params
        '''
        # (...)
    
        super(TweetStreamer, self).__init__(**kwargs)