将 json.dump 移植到 StringIO 代码中以 python 3
Porting json.dump into StringIO code to python 3
我正在将 Python 2 应用程序移植到 Python 3。目前 运行 宁 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 argument expected, got 'str'"(这是 运行ning 在 Python 2 下 - 可以这么说,我仍在准备地面,并且不打算使用Python 3 直到我在 Python 下完成尽可能多的准备和测试 2.)
通过一些实验,我尝试使用 io
中的 BytesIO
,但这会产生不同的错误 "TypeError: 'unicode' does not have the buffer interface"。
显然,json.dump 的 Python2 版本正在将 str
值写入提供的文件对象。我 认为 json.dump 的 Python3 版本也写入 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
的特殊情况,这给我带来了一些问题。
如果您的问题是 import 语句,只需将其包装在 try 语句中即可:
try:
from StringIO import StringIO
except ImportError:
from io import StringIO
你的其余代码应该可以正常工作,至少你问题中提供的代码对我来说工作得很好。
from six.moves import StringIO
我正在将 Python 2 应用程序移植到 Python 3。目前 运行 宁 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 argument expected, got 'str'"(这是 运行ning 在 Python 2 下 - 可以这么说,我仍在准备地面,并且不打算使用Python 3 直到我在 Python 下完成尽可能多的准备和测试 2.)
通过一些实验,我尝试使用 io
中的 BytesIO
,但这会产生不同的错误 "TypeError: 'unicode' does not have the buffer interface"。
显然,json.dump 的 Python2 版本正在将 str
值写入提供的文件对象。我 认为 json.dump 的 Python3 版本也写入 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
的特殊情况,这给我带来了一些问题。
如果您的问题是 import 语句,只需将其包装在 try 语句中即可:
try:
from StringIO import StringIO
except ImportError:
from io import StringIO
你的其余代码应该可以正常工作,至少你问题中提供的代码对我来说工作得很好。
from six.moves import StringIO