Python « TypeError: init () got multiple values for keyword argument 'target'

Пишу небольшого демона.
В демоне есть много тредов для разных целей, поэтому решено было сделать отдельный класс для тредов и вынести весь общий функционал в него:
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .python.geshi_code {font-family:monospace;} .python.geshi_code .imp {font-weight: bold; color: red;} .python.geshi_code .kw1 {color: #ff7700;font-weight:bold;} .python.geshi_code .kw2 {color: #008000;} .python.geshi_code .kw3 {color: #dc143c;} .python.geshi_code .kw4 {color: #0000cd;} .python.geshi_code .co1 {color: #808080; font-style: italic;} .python.geshi_code .coMULTI {color: #808080; font-style: italic;} .python.geshi_code .es0 {color: #000099; font-weight: bold;} .python.geshi_code .br0 {color: black;} .python.geshi_code .sy0 {color: #66cc66;} .python.geshi_code .st0 {color: #483d8b;} .python.geshi_code .nu0 {color: #ff4500;} .python.geshi_code .me1 {color: black;} .python.geshi_code span.xtra { display:block; }
class DaemonThread(Thread):
    def __init__(target, args=(), name=None, name_template=None):
        Thread.__init__(self, target=target, name=name, args=args)
        self.__daemon = registry['daemon']
        self.__stopper = ThreadingEvent()
        self.stopped = False
        daemon.register_thread(self)

Первое, что вызывается - тред подключения сокета
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .python.geshi_code {font-family:monospace;} .python.geshi_code .imp {font-weight: bold; color: red;} .python.geshi_code .kw1 {color: #ff7700;font-weight:bold;} .python.geshi_code .kw2 {color: #008000;} .python.geshi_code .kw3 {color: #dc143c;} .python.geshi_code .kw4 {color: #0000cd;} .python.geshi_code .co1 {color: #808080; font-style: italic;} .python.geshi_code .coMULTI {color: #808080; font-style: italic;} .python.geshi_code .es0 {color: #000099; font-weight: bold;} .python.geshi_code .br0 {color: black;} .python.geshi_code .sy0 {color: #66cc66;} .python.geshi_code .st0 {color: #483d8b;} .python.geshi_code .nu0 {color: #ff4500;} .python.geshi_code .me1 {color: black;} .python.geshi_code span.xtra { display:block; }
class DaemonConnection(DaemonThread):
    def __init__(self, conn, addr, id):
        DaemonThread.__init__(self, target=self.__looper__)
        #проставление псевдоприватных свойств
        self.start()

который и падает с вышеописанной ошибкой. Судя по отладчику, строка
DaemonThread.__init__(self, target=self.__looper__)
вызывается (!) дважды, при этом предыдущая строка вызывается всего один раз, а метод __init__() DaemonThread не успевает вызваться вообще.
Что я делаю не так?
P.S. функция super тянет напрямую Thread и в результате теряется весь смысл (скрипт валится с сообщением 'DaemonConnection' object has no attribute '_DaemonThread__stopper', __stopper создается в DaemonThread)
P.P.S. __mro__ в то же время в порядке

1 ответов


Случай оказался абсолютно идиотским
В аргументах DaemonThread.__init__() не был указан self.
Так как он тем или иным образом передавался в __init__, хоть с использование super, хоть через прямой вызов родителя, он подставлялся на место target, который я тоже всегда передавал именованным аргументом.