我正在将Python 2应用程序移植到Python3。当前正在运行Python2.7,但是在更新代码以通过pylint --py3k
测试时,我遇到了一个问题:
def json_resource_file(baseurl, jsondata, resource_info):
"""
Return a file object that reads out a JSON version of the supplied entity values data.
"""
response_file = StringIO()
json.dump(jsondata, response_file, indent=2, separators=(',', ': '), sort_keys=True)
response_file.seek(0)
return response_file
它在以下情况下可以正常工作
:from StringIO import StringIO
但是StringIO.StringIO
在Python3中不存在(根据pylint),因此使用:
from io import StringIO
我得到一个错误:“ TypeError:预期使用unicode参数,得到了'str'”(这是在Python 2下运行的-可以这么说,我仍在准备工作,并且不打算使用Python 3,直到我在Python 2下已经做了尽可能多的准备和测试。)
通过一些实验,我尝试使用BytesIO
中的io
,但这会产生不同的错误“ TypeError:'unicode'没有缓冲区接口”。
很显然,Python2版本的json.dump正在将str
值写入提供的文件对象。我认为 Python3版本的json.dump还写了str
(即Unicode)值。
所以我的问题是:是否有一种简单的方法可以将JSON转储到与Python 2和3兼容的StringIO内存缓冲区?
我意识到我可以使用json.dumps
并将结果强制为StringIO
所期望的任何类型,但这一切似乎都很笨拙。
在迁移过程中,我还将使用以下将来的导入内容:
from __future__ import (unicode_literals, absolute_import, division, print_function)
目前,我正在考虑的解决方案是测试python版本并相应地导入StringIO
的其他版本,但这会违反"Use feature detection instead of version detection"原则。
在我的大多数代码中,对于我使用from io import StringIO
的情况,使用StringIO
似乎可以正常工作。在StringIO
中使用json.dump
的特定情况引起了我一些问题。
答案 0 :(得分:0)
如果您的问题是import语句,只需将其包装在try语句中即可:
try:
from StringIO import StringIO
except ImportError:
from io import StringIO
您其余的代码应按原样工作,至少您问题中提供的代码对我来说是正常的。
答案 1 :(得分:0)
from six.moves import StringIO