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)**

答えを検索するときに、このエラーのいくつかの例をオンラインで見つけました。

'Thread.init'の引数として'self'を渡し、スーパークラスを呼び出す必要があります。

しかし、なぜエラーが発生するのかはまだわかりません。このエラーが発生した理由と問題の解決方法についてのガイダンス/ヘルプをいただければ幸いです。私はこのコードの作成者ではないため、問題を解決するために何を探すべきかわかりません。

次のコードが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__、他のクラスから継承していない限り、明示的に呼び出すことはありません。そのエラーが発生する可能性のある状況の 1 つを次に示します。

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 に答える