簡體   English   中英

Python:扭曲:如何從回調訪問列表

[英]Python: Twisted: How to access a list from a callback

我已經使用此處的信息作為指導編寫了一些代碼,

使用Twisted Python IRC框架列出IRC頻道中的用戶

我可以成功地將NAMES列表登錄到控制台,但是到目前為止,我仍然無法檢索該列表以進一步使用它。 這是與此事件相關的代碼的摘錄:

class Alfred(irc.IRCClient):
    """ An IRC bot """

    # Voodoo magic for names
    def __init__(self, *args, **kwargs):
        self._namescallback = {}


    def names(self, channel):
        channel = channel.lower()
        d = defer.Deferred()
        if channel not in self._namescallback:
           self. _namescallback[channel] = ([], [])

        self._namescallback[channel][0].append(d)
        self.sendLine("NAMES %s" % channel)
        return d


    def irc_RPL_NAMREPLY(self, prefix, params):
        channel = params[2].lower()
        nicklist = params[3].split(' ')

        if channel not in self._namescallback:
            return

        n = self._namescallback[channel][1]
        n += nicklist


    def irc_RPL_ENDOFNAMES(self, prefix, params):
        channel = params[1].lower()
        if channel not in self._namescallback:
            return

        callbacks, namelist = self._namescallback[channel]

        for cb in callbacks:
            cb.callback(namelist)

        del self._namescallback[channel]

    # End of voodoo magic

    def get_names(self, nicklist):
        # Log the output to the log
        log.msg(nicklist)


    def has_op(self, channel, user):
        self.names('#' + channel).addCallback(self.get_names)


    def change_mode(self, channel, user, msg):
        target = msg[5:-3]
        params = [channel, '+o']

        self.has_op(channel, user)
        self.mode(channel, True, '+o', user=target)

我要實現的是在has_op函數中保留所謂的昵稱列表。 到目前為止,我一直無法使用試錯法來執行此操作,在該方法中,我嘗試在合理的位置使用print和return語句,但這並沒有產生任何輸出或實例/屬性錯誤。 顯然,我很茫然,我確實需要一些指導。

has_op之內執行此操作的想法可能會阻止您取得進展。

使它完全起作用然后考慮如何改善實施因素。

請注意, get_names已經具有您感興趣的數據。 您想如何處理這些信息? 檢查是否包含特定名稱? 為此,您需要知道要考慮的名稱。 為此,您可以使用Deferred.addCallback功能,該功能可以將額外的參數傳遞給回調:

def get_names(self, nicklist, user):
    if user in nicklist:
        log.msg("%r has op!" % (user,))

def has_op(self, channel, user):
    self.names('#' + channel).addCallback(self.get_names, user)

現在,也許您真正想要的不是記錄此信息,而是在change_mode基於該信息做出決定(當然,我只是在猜測)。

如果是這樣,那么您想利用另一個Deferred功能-附加到Deferred的每個回調處理和更改Deferred結果的能力。

您可以更改has_op以便除了記錄信息外,它還返回Deferred但是,如果給定用戶在給定通道中具有op,則此Deferred可以具有True結果,而沒有給他們提供False結果。

def get_names(self, nicklist, user):
    return user in nicklist

def has_op(self, channel, user):
    return self.names('#' + channel).addCallback(self.get_names, user)

現在,您可以在change_mode使用此功能:

def change_mode(self, channel, user, msg):
    target = msg[5:-3]

    checking = self.has_op(channel, user)
    checking.addCallback(self._ofIfNotOp, channel, target)

def _opIfNotOp(self, isOp, channel, user):
    if not isOp:
        self.mode(channel, True, '+o', user=user)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM