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; }
Первое, что вызывается - тред подключения сокета
/** * 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; }
который и падает с вышеописанной ошибкой. Судя по отладчику, строка
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__ в то же время в порядке
В демоне есть много тредов для разных целей, поэтому решено было сделать отдельный класс для тредов и вынести весь общий функционал в него:
/** * 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)
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()
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, который я тоже всегда передавал именованным аргументом.