1

我是 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

4

1 回答 1

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)

尽管如果不实际查看产生错误的代码,这种问题可能很难诊断。

于 2012-07-16T13:56:38.933 回答