在Python中访问全局队列对象
我正在用Python开发一个消息应用,它可以和Twitter连接。我想创建一个全局的先进先出(FIFO)队列,让TwitterConnection对象可以用来插入新消息。
这是应用的主要部分:
#!/usr/bin/python
from twitterConnector import TwitterConnector
from Queue import deque
#instantiate the request queue
requestQueue = deque()
#instantiate the twitter connector
twitterInterface = TwitterConnector()
#Get all new mentions
twitterInterface.GetMentions()
具体来说,我希望能够调用TwitterConnector类的.GetMentions()方法,处理任何新的提及,并把这些消息放入队列中,单独进行处理。
这是目前的TwitterConnector类:
class TwitterConnector:
def __init__(self):
self.connection = twitter.Api(consumer_key=self.consumer_key,consumer_secret=self.consumer_secret,access_token_key=self.access_token_key,access_token_secret=self.access_token_secret)
self.mentions_since_id = None
def VerifyCredentials(self):
print self.connection.VerifyCredentials()
def GetMentions(self):
mentions = self.connection.GetMentions(since_id=self.mentions_since_id)
for mention in mentions:
print mention.text
global requestQueue.add(mention) # <- error
任何帮助都将非常感谢。
更新:让我再澄清一下使用场景。我的TwitterConnector旨在获取消息,并最终将Twitter状态对象转换为一个简化的对象,这个对象包含后续处理所需的信息。在同一个方法中,它还会进行一些其他计算,以尝试确定其他需要的信息。实际上,我想放入队列的是这些转换后的对象。希望这样说能让你明白。作为一个简单的例子,这个方法会将Twitter状态对象映射到一个新对象,这个新对象会包含一些属性,比如:来源网络(Twitter)、用户名、消息和可用的位置信息。然后,这个新对象会被放入队列。
最终还会有其他连接器,用于其他消息系统,它们会执行类似的操作。它们会接收消息,填充新的消息对象,并将它们放入同一个队列中进行进一步处理。一旦消息完全处理完,就会形成一个响应,然后将其添加到适当的队列中进行发送。使用上面描述的新对象,一旦实际处理了推文内容,就可以根据来源网络和用户名,通过Twitter将响应返回给发起者。
我曾考虑在构造函数中传递队列的引用(或者作为方法的参数),我也想过修改方法以返回新对象的列表,然后遍历这些对象将它们放入队列,但我想确保没有更好或更有效的处理方式。我还希望能对日志对象和数据库处理器做同样的事情。你有什么想法吗?
2 个回答
一般来说,尽量避免使用全局变量是个好主意; 通常会有更好的设计方案。关于全局变量的问题,可以参考一些资料,比如 ([1], [2], [3], [4]).
如果你想通过使用全局变量来在多个 TwitterConnector
实例之间共享一个单一的 requestQueue
,你也可以在创建连接器的时候把这个队列传给它的构造函数:
class TwitterConnector:
def __init__(self, requestQueue):
self.requestQueue = requestQueue
...
def GetMentions(self):
mentions = self.connection.GetMentions(since_id = self.mentions_since_id)
requestQueue = deque()
for mention in mentions:
print mention.text
self.requestQueue.add(mention)
相应地,你需要像下面这样把你的 requestQueue
提供给构造函数:
twitterInterface = TwitterConnector(requestQueue)
问题是“global”应该单独写在一行上。
global requestQueue
requestQueue.add(mention)
而且,requestQueue必须在定义这个类的模块里出现。
如果你是从另一个类导入requestQueue这个符号,那么根本不需要使用global。
from some_module import requestQueue
class A(object):
def foo(o):
requestQueue.add(o) # Should work