我必须将自定义GTK元素的各种属性保存到文件中以供将来使用,决定使用JSON格式,因为它具有简单的格式和字典嵌套。许多属性都是GTK enums,例如`gtk.PAGE_ORIENTATION_PORTRAIT`,`gtk.ANCHOR_CENTER`和`pango.ALIGN_LEFT`。可以使用`obj.value_name`检索它们的唯一名称,以获取有效的JSON类型。
目前,我对我的每个元素有两种方法:`to_str()`获取`value_name`和`from_str()`将`str`映射回枚举。我想自动化这个过程,这样我就不会忘记调用它们并清理代码。JSONEncoder和JSONDecoder正是这样做的,或者我认为是这样...这是Python文档中给出的示例,并且按预期工作。
请注意
目前,我对我的每个元素有两种方法:`to_str()`获取`value_name`和`from_str()`将`str`映射回枚举。我想自动化这个过程,这样我就不会忘记调用它们并清理代码。JSONEncoder和JSONDecoder正是这样做的,或者我认为是这样...这是Python文档中给出的示例,并且按预期工作。
import json
class ComplexEncoder(json.JSONEncoder):
def default(self, obj):
print "default method called for:", obj
if isinstance(obj, complex):
return [obj.real, obj.imag]
return json.JSONEncoder.default(self, obj)
print json.dumps(2 + 1j, cls=ComplexEncoder)
根据这个例子,我添加了GTK枚举:
import json
import gtk
ENUMS = [gtk.PAGE_ORIENTATION_PORTRAIT, gtk.PAGE_ORIENTATION_LANDSCAPE]
class GtkEncoder(json.JSONEncoder):
def default(self, obj):
print "default method called for:", obj
if obj in ENUMS:
return obj.value_name
return json.JSONEncoder.default(self, obj)
print json.dumps(gtk.PAGE_ORIENTATION_LANDSCAPE, cls=GtkEncoder)
请注意
default
方法中添加的打印语句。在原始示例中,该方法可以正常调用,但在GTK示例中无法调用。 default
方法从未被调用,并返回不是有效JSON的<enum GTK_PAGE_ORIENTATION_LANDSCAPE of type GtkPageOrientation>
。
那么,是否有自动编码/解码这些枚举的方法,还是我必须使用当前手动方法?请注意,要转储的数据结构不是单个值,而是一个字典或多个字典。
encode
的value
参数为整个对象,因此会失败。 - Timo