Python:Twisted:如何从回调中访问列表
Posted
技术标签:
【中文标题】Python:Twisted:如何从回调中访问列表【英文标题】:Python: Twisted: How to access a list from a callback 【发布时间】:2013-10-11 19:06:45 【问题描述】:我已经使用此处的信息作为指导编写了一些代码,
List users in IRC channel using Twisted Python IRC framework
我可以成功地将 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 语句,但这并没有产生任何输出或实例/属性错误。显然,我很茫然,我真的需要一些指导。
【问题讨论】:
【参考方案1】:“在”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
- 但是如果给定用户在给定频道中有操作并且False
,则此Deferred
可以有True
结果结果他们没有。
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)
【讨论】:
谢谢,这真的很有帮助。由此我可以奠定我需要继续前进的基础,所以干杯!感谢您弄清楚我的意图,也就是说,我的意图是什么。以上是关于Python:Twisted:如何从回调中访问列表的主要内容,如果未能解决你的问题,请参考以下文章
使用Twisted python,有一种机制可以找到类似于socket.open的空闲端口。