【发布时间】:2010-08-11 22:54:30
【问题描述】:
好的,我在表达我正在处理的代码的问题时遇到了问题,但没有倾倒大量代码;所以这就是同步的(而不是从异步的角度询问它)。
对于类来说,什么时候应该通过方法参数访问变量,什么时候应该通过实例变量访问?
同时它看起来像这样...... 注意:实际的服务器 url 和解析是不同的,但只是使事情复杂化。同样在以下示例中,get_token 方法将会话作为参数,是否应该改为使用 self.session 来获取会话?
import urllib
import time
class SyncExampleClass(object):
def __init__(self):
self.session = None
self.token = None
self.session_time = -1
def get_session(self):
s = urllib.urlopen("http://example.com/session/").read()
self.session_time = int(time.time())
return s
def get_token(self, session):
t = urllib.urlopen("http://example.com/token/?session=%s" % session).read()
return t
def construct_api_call(self, api_method):
# if the session is over an hour old (is that the correct sign?)
if time.time() - 3600 > self.session_time or self.session is None:
self.session = get_session()
self.token = get_token(self.session)
call = urllib.urlopen("http://example.com/api/?method=%s%session=%s&token=%s" % (api_method, self.session, self.token) ).read()
return call
【问题讨论】:
-
第一次在
construct_api_call中设置 self.session 后,如果距上次设置不到一小时,您将设置另一个 - 如果您有一个小时没有调用它,您' 将永远不会再设置另一个会话(或令牌)。非常奇怪的行为——你确定if中的<是你想要的吗?! (当你通过代码给出规范时,你最好加倍确保代码完全按照你的意愿做,当然,因为没有“自然语言”对应物来审查规范)。 -
@Alex Martelli 是的,你是对的;我的意思是如果会话超过一个小时。 (我在编辑中修复了它(所以如果你现在看它是正确的(我认为))
-
session和token变量实际上是 URL 的一部分,还是它们是 cookie?你的电话是urllib.urlopen充其量会阻塞反应堆。你应该改用twisted.web.http.HTTPClient。 -
它们实际上是在实际实现中发布数据,这就是看起来没有所有不必要的复杂性的样子,我也知道 urllib 会阻塞,这就是为什么它是同步示例而不是异步示例。
标签: python asynchronous twisted