OregonTrail
OregonTrail

Reputation: 9049

Superclass __init__ not recognizing its kwargs

I'm trying to use the StoppableThread class presented as an answer to another question:

import threading

# Technique for creating a thread that can be stopped safely
# Posted by Bluebird75 on StackOverflow
class StoppableThread(threading.Thread):
    """Thread class with a stop() method. The thread itself has to check
    regularly for the stopped() condition."""

    def __init__(self):
        super(StoppableThread, self).__init__()
        self._stop = threading.Event()

    def stop(self):
        self._stop.set()

    def stopped(self):
        return self._stop.isSet()

However, if I run something like:

st = StoppableThread(target=func)

I get:

TypeError: __init__() got an unexpected keyword argument 'target'

Probably an oversight on how this should be used.

Upvotes: 4

Views: 1552

Answers (2)

Bernhard Kausler
Bernhard Kausler

Reputation: 5267

You are overriding init and your init doesn't take any arguments. You should add a "target" argument and pass it through to your base class constructor with super or even better allow arbitrary arguments via *args and *kwargs.

I.e.

def __init__(self,*args,**kwargs):
    super(threading.Thread,self).__init__(*args,**kwargs)
    self._stop = threading.Event()

Upvotes: 1

isedev
isedev

Reputation: 19641

The StoppableThread class does not take or pass any additional arguments to threading.Thread in the constructor. You need to do something like this instead:

class StoppableThread(threading.Thread):
    """Thread class with a stop() method. The thread itself has to check
    regularly for the stopped() condition."""

    def __init__(self,*args,**kwargs):
        super(threading.Thread,self).__init__(*args,**kwargs)
        self._stop = threading.Event()

This will pass both positional and keyword arguments to the base class.

Upvotes: 5

Related Questions