我是Python和BuildBot的全新用户。目前我正在使用电子邮件提醒 当BuildBot构建状态发生变化时(从成功变为失败,反之亦然),每次构建失败时,失败都会发送电子邮件。我在尝试发送电子邮件时遇到以下Python错误。
--- <exception caught here> ---
**ESMTPClient.__init__(self, secret, contextFactory, *args, **kw)
exceptions.TypeError?: unbound method init() must be called with ESMTPClient
instance as first argument (got ESMTPSender instance instead)**
我在搜索答案时在网上找到了一些此错误的例子,包括
你只需要将'self'作为参数传递给'Thread.init'和 调用超类
但我仍然不确定为什么会出错。我将非常感谢有关此错误发生的原因以及如何解决问题的任何指导/帮助。我不是这段代码的作者,所以我不确定要解决问题的方法。
在将以下代码从gmail帐户更改为公司帐户之前,该电子邮件正常运行。
c['status'].append(mail.MailNotifier(
fromaddr="load.builder@company.co.uk",
extraRecipients=["example@company.com",
],
sendToInterestedUsers=False,
mode=('change', 'failing'),
relayhost="smtp.company.lan",
useTls=True,
smtpUser="lbuilder",
smtpPassword="password"))
以下是产生异常的代码块:
class ESMTPSender(SenderMixin, ESMTPClient):
requireAuthentication = True
requireTransportSecurity = True
def __init__(self, username, secret, contextFactory=None, *args, **kw):
self.heloFallback = 0
self.username = username
if contextFactory is None:
contextFactory = self._getContextFactory()
ESMTPClient.__init__(self, secret, contextFactory, *args, **kw)
self._registerAuthenticators()
SSA
答案 0 :(得分:1)
这似乎是一个很难的例外 - 通常你不会明确地调用__init__
,除非你继承其他类。在这种情况下,您可能会收到该错误:
class Foo(object):
def __init__(self,*args):
print("In Foo, args:",args,type(self))
class Bar(object):
def __init__(self,*args):
Foo.__init__(self,*args) #Doesn't work. Complains that the object isn't the right type.
要解决此问题,我们可以Bar
继承Foo
:
class Bar(Foo):
#^ Bar now inherits from Foo
def __init__(self,*args):
Foo.__init__(self,*args) #This will work now since a Bar instance is a Foo instance
如果从Bar
获取Foo
子类没有意义,则可以将公共代码分解为单独的函数:
def common_code(instance,*args):
print("Common code: args",args,type(instance))
class Foo(object):
def __init__(self,*args):
common_code(self,*args)
class Bar(object):
def __init__(self,*args):
common_code(self,*args)
虽然在没有实际看到产生错误的代码的情况下很难诊断出这种问题。