在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)、用户名、消息和位置(如果可用)。然后,这个新对象将被放入队列中。

最终会有其他消息传递系统的其他连接器执行类似的操作。它们将接收一条消息,填充新消息对象,并将它们放入同一队列中进行进一步处理。一旦消息被完全处理,将形成响应,然后将其添加到适当的队列中以进行传输。使用上面描述的新对象,一旦对tweet内容进行了实际处理,那么根据原始网络和用户名,可能会通过twitter向发起者返回响应。

我想过在承包商中传递一个引用给队列(或者作为方法的参数),我也想过修改方法来返回一个新对象的列表,并对它们进行迭代以将它们放入队列,但我想确保没有更好或更有效的方法来处理这个问题。我还希望能够用日志对象和数据库处理程序做同样的事情。想法吗?

问题是"global"应该单独出现在一行

global requestQueue
requestQueue.add(mention)

而且,requestQueue必须出现在定义类的模块中。

如果你是从另一个类中导入requestQueue符号,你根本不需要全局变量。

from some_module import requestQueue
class A(object):
    def foo(o):
         requestQueue.add(o) # Should work

通常避免全局变量是一个好主意;更好的设计往往存在。关于全局变量的详细信息,请参见For instance([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)

相关内容

  • 没有找到相关文章

最新更新