2015-08-21 26 views
0

改变大小有它发送崇高插件RuntimeError:字典中迭代

postdata = {"some" : "value"} 
user_headesr = Config.get_headers() //returning static class variable 
requests.post(url, data=json.dumps(postdata), headers=user_headers) 

一类,但我得到的错误

Traceback (most recent call last): 
    File "/Applications/Sublime Text.app/Contents/MacOS/sublime_plugin.py", line 535, in run_ 
    return self.run() 
    File "~Library/Application Support/Sublime Text 3/Packages/MyPlugin/compile_code.py", line 22, in run 
    compile_response = hr.send_code_to_server(code, HackerRankConfig.language) 
    File "~Library/Application Support/Sublime Text 3/Packages/MyPlugin/plugin/hackerrank.py", line 15, in send_code_to_server 
    resp = requests.post(HackerRankConfig.compile_tests_url, data=json.dumps(postdata), headers=user_headers) 
    File "~Library/Application Support/Sublime Text 3/Packages/MyPlugin/requests/requests/api.py", line 109, in post 
    return request('post', url, data=data, json=json, **kwargs) 
    File "~Library/Application Support/Sublime Text 3/Packages/MyPlugin/requests/requests/api.py", line 50, in request 
    response = session.request(method=method, url=url, **kwargs) 
    File "~Library/Application Support/Sublime Text 3/Packages/MyPlugin/requests/requests/sessions.py", line 455, in request 
    prep = self.prepare_request(req) 
    File "~Library/Application Support/Sublime Text 3/Packages/MyPlugin/requests/requests/sessions.py", line 382, in prepare_request 
    headers=merge_setting(request.headers, self.headers, dict_class=CaseInsensitiveDict), 
    File "~Library/Application Support/Sublime Text 3/Packages/MyPlugin/requests/requests/sessions.py", line 66, in merge_setting 
    for (k, v) in merged_setting.items(): 
    File "./collections/abc.py", line 479, in __iter__ 
    File "~Library/Application Support/Sublime Text 3/Packages/MyPlugin/requests/requests/structures.py", line 60, in <genexpr> 
    return (casedkey for casedkey, mappedvalue in self._store.values()) 
RuntimeError: dictionary changed size during iteration 
  • 我的代码是不会改变的字典里,get_headers( )从package.sublime-settings文件读取。

  • 我试过让该方法返回副本以确保不会导致问题,仍然存在问题。

  • 我使用python 3.3.3,崇高的文本3

+0

不是错误,但是'requests'版本使用的是支持张贴'json'直接使用'请求.post(HackerRankConfig.compile_tests_url,json = postdata,headers = user_headers)'(你不必设置'Co在这种情况下是ntent-Type头)。 –

+0

这是在最新版本的'requests'中引入的一个错误。 –

回答

0

您正在使用从GitHub采取当前requests主分支。不要使用当前的开发版本很容易导致问题,因为它尚未发布。您正在使用的修订包含仅存在于Python 3上的字典头合并代码中的错误; this change没有考虑到dict.items()是Python 3的活字典视图:

>>> requests.get('http://httpbin.org/get', headers={'foo': None}) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Users/mj/Development/venvs/stackoverflow-3.4/requests/requests/api.py", line 69, in get 
    return request('get', url, params=params, **kwargs) 
    File "/Users/mj/Development/venvs/stackoverflow-3.4/requests/requests/api.py", line 50, in request 
    response = session.request(method=method, url=url, **kwargs) 
    File "/Users/mj/Development/venvs/stackoverflow-3.4/requests/requests/sessions.py", line 455, in request 
    prep = self.prepare_request(req) 
    File "/Users/mj/Development/venvs/stackoverflow-3.4/requests/requests/sessions.py", line 382, in prepare_request 
    headers=merge_setting(request.headers, self.headers, dict_class=CaseInsensitiveDict), 
    File "/Users/mj/Development/venvs/stackoverflow-3.4/requests/requests/sessions.py", line 66, in merge_setting 
    for (k, v) in merged_setting.items(): 
    File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python3.4/_collections_abc.py", line 503, in __iter__ 
    for key in self._mapping: 
    File "/Users/mj/Development/venvs/stackoverflow-3.4/requests/requests/structures.py", line 60, in <genexpr> 
    return (casedkey for casedkey, mappedvalue in self._store.values()) 
RuntimeError: dictionary changed size during iteration 

我已经提交了pull request妥善解决该问题(现已合并)。

最好的办法是坚持从PyPI中的最新版本(目前是version 2.7.0这是经得起考验的。

如果您不能使用的PyPI版本也可以检查出的当前提示master分支,一个解决办法是使用标头就过滤掉从字典None值:

user_headers = {k: v for k, v in Config.get_headers().items() if v is not None} 
+0

https://github.com/dineshkumar-cse/SublimePluginHackerRank是repo,它可以在相同的python版本下正常工作,但后来在本地我重构了它,并且失败了。我错过了什么? – Dineshkumar