gpt4 book ai didi

python - 请求之间神秘的字典持久性?

转载 作者:太空宇宙 更新时间:2023-11-04 10:50:06 24 4
gpt4 key购买 nike

我有一系列函数都传递一个字典,但在每个实例中,字典都应以 {} 开头。然而,我发现在对不同 View 的顺序请求中,dict 正在记住数据,导致以后出现问题。

相关代码如下:

def picasa_sync_friend(user_profile, friend_id, force_update=False):
logger.warn('picasa_sync_friend')
data, error = picasa_query_by_profile('albums', user_profile, replace=(friend_id))
....

def picasa_sync_albums(user_profile, friend_id="default"):
logger.warn('picasa_sync_albums')
data, error = picasa_query_by_profile('albums', user_profile, replace=(friend_id))
...

def picasa_sync_pictures(user_profile, album_id, force_update=False, full_update=False):
friend_id = picasa_get_album(user_profile, album_id).friend.foreign_reference
subject = 'photos' if full_update else 'thumbs'
logger.warn('picasa_sync_pictures')
data, error = picasa_query_by_profile(subject, user_profile, replace=(friend_id, album_id))
...

def picasa_query_by_profile(subject, user_profile, args={}, replace=(), format='xml'):
logger.warn('picasa_query_by_profile: %s' % args)
access_token = picasa_get_token(user_profile).access_token
response = picasa_query(subject, access_token, args=args, replace=replace)
...

def picasa_query(subject, access_token='', args={}, replace=()):
logger.warn('picasa_query: %s' % args)
url, request_args, method = picasa_query_params(subject, access_token=access_token, args=args, replace=replace)
...

def picasa_query_params(subject, access_token='', args={}, replace=()):
method = 'GET'
base_url = 'https://accounts.google.com/o/oauth2/'
logger.warn('picasa_query_params (before): %s' % args)
if subject == 'albums':
args['access_token'] = access_token
subject = ''
base_url = 'https://picasaweb.google.com/data/feed/api/user/%s' % replace
args['kind'] = 'album'
args['v'] = '2.0'
args['fields'] = 'entry(title,gphoto:id,gphoto:numphotos,published)'
elif subject == 'photos':
args['access_token'] = access_token
base_url = 'https://picasaweb.google.com/data/feed/api/user/%s/albumid/%s' % replace
args['v'] = '2.0'
args['kind'] = 'photo'
args['fields'] = 'entry(gphoto:id,content(@src),gphoto:width,gphoto:height)'
subject = ''
elif subject == 'thumbs':
args['access_token'] = access_token
base_url = 'https://picasaweb.google.com/data/feed/api/user/%s/albumid/%s' % replace
args['v'] = '2.0'
args['kind'] = 'photo'
args['fields'] = 'entry(gphoto:id,content(@src),gphoto:width,gphoto:height)'
args['max-results'] = ALBUM_THUMBNAIL_LIMIT
subject = ''
logger.warn('picasa_query_params (after ): %s' % args)
url = '%s%s' % (base_url, subject)
return url, args, method

因此问题出现了,我有一个调用 picasa_sync_friend 的 View ,然后调用 picasa_sync_albums 并将所有相册数据返回给客户端。

然后对于每个相册,客户端发出一个单独请求,为每个 album_id 调用 picasa_sync_pictures

初始好友/相册请求的记录器输出如下所示:

WARNING 2013-01-26 07:27:23,611 picasa_sync_friend
WARNING 2013-01-26 07:27:23,617 picasa_query_by_profile:
{}
WARNING 2013-01-26 07:27:23,633 picasa_query:
{}
WARNING 2013-01-26 07:27:23,633 picasa_query_params (albums:before):
{}
WARNING 2013-01-26 07:27:23,633 picasa_query_params (:after ):
{'access_token': u'xxx', 'fields': 'entry(title,gphoto:id,gphoto:numphotos,published)', 'kind': 'album', 'v': '2.0'}

WARNING 2013-01-26 07:27:24,388 picasa_sync_albums
WARNING 2013-01-26 07:27:24,388 picasa_query_by_profile:
{'access_token': u'xxx', 'fields': 'entry(title,gphoto:id,gphoto:numphotos,published)', 'kind': 'album', 'v': '2.0'}
WARNING 2013-01-26 07:27:24,389 picasa_query:
{'access_token': u'xxx', 'fields': 'entry(title,gphoto:id,gphoto:numphotos,published)', 'kind': 'album', 'v': '2.0'}
WARNING 2013-01-26 07:27:24,389 picasa_query_params (before):
{'access_token': u'xxx', 'fields': 'entry(title,gphoto:id,gphoto:numphotos,published)', 'kind': 'album', 'v': '2.0'}
WARNING 2013-01-26 07:27:24,389 picasa_query_params (after ):
{'access_token': u'xxx', 'fields': 'entry(title,gphoto:id,gphoto:numphotos,published)', 'kind': 'album', 'v': '2.0'}

请注意,在 picasa_sync_albums -> picasa_query_by_profile 中,已经填充了首字母 args 字典,尽管 picasa_sync_albums 没有向 args 数组键发送任何数据。

上面的记录器输出结束了 friend /相册请求,接下来要输入的是直接进入 picasa_sync_pictures 的单个相册的图片列表:

WARNING 2013-01-26 07:27:25,981 picasa_sync_pictures
WARNING 2013-01-26 07:27:25,998 picasa_query_by_profile:
{'access_token': u'xxx', 'fields': 'entry(title,gphoto:id,gphoto:numphotos,published)', 'kind': 'album', 'v': '2.0'}
WARNING 2013-01-26 07:27:26,011 picasa_query:
{'access_token': u'xxx', 'fields': 'entry(title,gphoto:id,gphoto:numphotos,published)', 'kind': 'album', 'v': '2.0'}
WARNING 2013-01-26 07:27:26,020 picasa_query_params (before):
{'access_token': u'xxx', 'fields': 'entry(title,gphoto:id,gphoto:numphotos,published)', 'kind': 'album', 'v': '2.0'}
WARNING 2013-01-26 07:27:26,022 picasa_query_params (after ):
{'access_token': u'xxx', 'fields': 'entry(gphoto:id,content(@src),gphoto:width,gphoto:height)', 'kind': 'photo', 'max-results': 4, 'v': '2.0'}

请注意,在 picasa_query_by_profile 中,args 已经包含 'kind': 'album',尽管这应该是一个新请求。

如果我随后刷新页面,再次调用 friend/albums,我会得到以下日志输出:

WARNING 2013-01-26 07:45:32,589 picasa_sync_friend
WARNING 2013-01-26 07:45:32,593 picasa_query_by_profile:
{'access_token': u'xxx', 'fields': 'entry(gphoto:id,content(@src),gphoto:width,gphoto:height)', 'kind': 'photo', 'max-results': 4, 'v': '2.0'}
WARNING 2013-01-26 07:45:32,597 picasa_query:
{'access_token': u'xxx', 'fields': 'entry(gphoto:id,content(@src),gphoto:width,gphoto:height)', 'kind': 'photo', 'max-results': 4, 'v': '2.0'}
WARNING 2013-01-26 07:45:32,598 picasa_query_params (before):
{'access_token': u'xxx', 'fields': 'entry(gphoto:id,content(@src),gphoto:width,gphoto:height)', 'kind': 'photo', 'max-results': 4, 'v': '2.0'}
WARNING 2013-01-26 07:45:32,600 picasa_query_params (after ):
{'access_token': u'xxx', 'fields': 'entry(title,gphoto:id,gphoto:numphotos,published)', 'kind': 'album', 'max-results': 4, 'v': '2.0'}

这是它开始真正影响应用程序的地方,因为它将 max-results 之类的东西应用于专辑列表,这是不受欢迎的。

现在我可以通过非常明确地删除不应该应用于某些主题的 dict 项来解决所有这些问题,但这使得它变得非常难以维护,并且计划将此代码扩展为许多不同的主题因此它需要灵活且不易出轨。

我很确定我在这里遗漏了 python/django 的一些基本部分,但我完全无法解释上述行为!感谢您的任何建议。

最佳答案

您不应该使用可变值作为 Python 函数的默认参数。请考虑以下事项:

def f(arg={}):
print arg
if 'count' in arg:
arg['count'] += 1
else:
arg['count'] = 1

f()
f()
f()

令人惊讶的是,这会打印出来

{}
{'count': 1}
{'count': 2}

发生的是 f(arg={}) 中的 {} 被评估一次,并且每当 f() 被调用。因此,对 args 的任何更改都会在调用中保留。

修复上述代码的一种方法是:

def f(arg=None):
if not arg:
arg = {}
print arg
if 'count' in arg:
arg['count'] += 1
else:
arg['count'] = 1

您代码中的以下函数受此问题影响:

def picasa_query_by_profile(subject, user_profile, args={}, replace=(), format='xml'):
def picasa_query(subject, access_token='', args={}, replace=()):
def picasa_query_params(subject, access_token='', args={}, replace=()):

关于python - 请求之间神秘的字典持久性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14535007/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com