JSON 编码/解码 GTK 枚举

2024-02-04

我必须将自定义 GTK 元素的各种属性保存到文件中以供将来使用,并由于简单的格式和字典嵌套而决定使用 JSON。

许多属性都是 GTK 枚举,例如gtk.PAGE_ORIENTATION_PORTRAIT, gtk.ANCHOR_CENTER and pango.ALIGN_LEFT。它们有一个唯一的名称,可以通过以下方式检索obj.value_name获取有效的 JSON 类型。

目前我的每个元素都有两种方法:to_str()获取 value_name 和from_str()它再次将 str 映射到 enum。我想自动执行此操作,这样我就不会忘记调用这些并稍微清理一下代码。 JSONEncoder 和 JSONDecodr 正是这样做的,或者我是这么想的......

这是 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)

注意添加的 print 语句default方法。在原始示例中,调用此方法没有问题,但在 GTK 示例中则不然。这default方法从未被调用并且它返回<enum GTK_PAGE_ORIENTATION_LANDSCAPE of type GtkPageOrientation>这当然不是有效的 JSON。

那么,有没有一种方法可以自动编码/解码这些枚举,或者我是否坚持使用当前的手动方法?请注意,我要转储的数据结构不是单个值,而是一个或多个字典。


发生观察到的行为是因为值gtk.PAGE_ORIENTATION_LANDSCAPE是一个实例class 'gtk._gtk.PageOrientation'它继承了type 'gobject.GEnum'反过来又继承了type 'int'.

所以你的 GTK 枚举是整数,并且 json 代码假设它可以处理整数,因此不会调用default你的编码器的方法。

不幸的是,当前的 json 实现对于编码子类类型没有那么有帮助,如下所示:-/没有继承和重写使这成为可能(至少我找不到任何解决方案)。检查值的硬编码位置太多isinstance(value, (int, long)).

But you can当然,修补 json 编码器的源代码即可实现您的目标,而无需重新实现整个 json 功能。为此复制文件encoder.py来自 json 库(对我来说这是/usr/lib/python2.7/json/encoder.py)到您的工作目录并修补它。

在函数中_iterencode_list() and _iterencode_dict()(它们是本地函数_make_iterencode())你可以找到类型检查int or long;如果是这样,当前的实现只是调用str(value)。将其更改为encodeInt(value)(在三个地方!)并实现您自己的encodeInt()函数于encoder.py:

def encodeInt(value):
  try:
    return value.value_name
  except:
    return str(value)

然后,在原始代码中,您必须直接导入该修补文件:

import encoder

并且您必须确保不再使用 C 实现,而是使用修补后的代码。 (您会看到,通常使用(更快的)C 实现,而我们修补某些内容的 Python 代码则不是。)要实现此目的,只需在导入后添加:

encoder.c_make_encoder = None

现在可以使用您的修补编码器:

print encoder.JSONEncoder().encode({
  gtk.PAGE_ORIENTATION_PORTRAIT: [
    gtk.PAGE_ORIENTATION_LANDSCAPE
  ],
  gtk.PAGE_ORIENTATION_LANDSCAPE: gtk.PAGE_ORIENTATION_PORTRAIT })

prints:

{"GTK_PAGE_ORIENTATION_PORTRAIT": [GTK_PAGE_ORIENTATION_LANDSCAPE], "GTK_PAGE_ORIENTATION_LANDSCAPE": GTK_PAGE_ORIENTATION_PORTRAIT}

请注意,Json 字典键始终必须是字符串。这就是为什么您的值在用作键时会得到双引号。但这也是命运的常态ints — 当用作密钥时 — 共享。它们也会被字符串化。

你可以看看http://pastebin.com/2HAtN9E8 http://pastebin.com/2HAtN9E8查看所有来源。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSON 编码/解码 GTK 枚举 的相关文章

  • Python有条件求解时滞微分方程

    我在用dde23 of pydelay包来求解延迟微分方程 我的问题 如何有条件地编写方程 例如目标方程有两个选项 when x gt 1 dx dt 0 25 x t tau 1 0 pow x t tau 10 0 0 1 x othe
  • Python从int到string的快速转换

    我正在用 python 求解大量阶乘 并发现当我完成计算阶乘时 需要相同的时间才能转换为字符串以保存到文件中 我试图找到一种将 int 转换为字符串的快速方法 我将举一个计算和 int 转换时间的例子 我正在使用通用的 a str a 但感
  • TF map_fn 或 while_loop 用于不同形状的张量列表

    我想处理不同形状的张量序列 列表 并输出另一个张量列表 考虑每个时间戳上具有不同隐藏状态大小的 RNN 就像是 输入 tf ones 1 2 2 tf ones 2 2 3 tf ones 3 2 1 输出 tf zeros 1 2 4 t
  • 了解 Python 中的酸洗

    我最近接到一项作业 需要以腌制形式放置一本字典 其中每个键引用一个列表 唯一的问题是我不知道腌制形式是什么 谁能给我指出一些好的资源的正确方向来帮助我学习这个概念 pickle 模块实现了一个基本但强大的算法 用于序列化和反序列化 Pyth
  • 更改 Altair 中的构面标题位置?

    如何将方面标题 在本例中为年份 移动到每个图的上方 默认值似乎位于图表的一侧 这可以轻易改变吗 import altair as alt from vega datasets import data df data seattle weat
  • 使用 Rails 中的 postgres json 字段更新嵌套键

    我一直在尝试更新以下内容 boxes book 2 moving 2 goods to boxes book new 2 moving 2 goods 无需使用正则表达式或在 ruby 中执行此操作 但似乎有点棘手 我想添加新密钥 然后删除
  • WindowsError:[错误 126] 使用 ctypes 加载操作系统时

    python代码无法在Windows 7平台上运行 def libSO lib ctypes cdll LoadLibrary ConsoleApplication2 so lib cfoo2 1 3 当我尝试运行它时 得到来自python
  • Python Fabric - 未找到主机。请指定用于连接的(单个)主机字符串:

    如何获取 找不到主机 请指定用于连接的 单个 主机字符串 面料如何解决 def bootstrap host ec2 54 xxx xxx xxx compute 1 amazonaws com env hosts host env use
  • 动态 __init_subclass__ 方法的参数绑定

    我正在尝试让类装饰器工作 装饰器会添加一个 init subclass 方法到它所应用的类 但是 当该方法动态添加到类中时 第一个参数不会绑定到子类对象 为什么会发生这种情况 举个例子 这是可行的 下面的静态代码是我试图最终得到的示例 cl
  • Python 惰性迭代器

    我试图了解迭代器表达式如何以及何时被求值 以下似乎是一个懒惰的表达 g i for i in range 1000 if i 3 i 2 然而 这个在构造上失败了 g line strip for line in open xxx r if
  • 具有屏蔽无效值的 pcolormesh

    我试图将一维数组绘制为 pcolormesh 因此颜色沿 x 轴变化 但每个 x 的 y 轴保持不变 但我的数据有一些错误值 因此我使用屏蔽数组和自定义颜色图 其中屏蔽值设置为蓝色 import numpy as np import mat
  • PyTorch DataLoader 对并行运行的批次使用相同的随机种子

    有一个bug https tanelp github io posts a bug that plagues thousands of open source ml projects 在 PyTorch Numpy 中 当并行加载批次时Da
  • Python 类型安全吗?

    根据维基百科 https en wikipedia org wiki Type system Type safety and memory safety 如果一种语言不允许违反类型系统规则的操作或转换 计算机科学家就认为该语言是 类型安全的
  • 解析根元素内元素之间的 XML 文本

    我正在尝试用 Python 解析 XML 以下是 XML 结构的示例 a aaaa1 b bbbb b aaaa2 a
  • 对数据帧的每 2 小时数据进行 Groupby

    我有一个数据框 Time T201FN1ST2010 T201FN1VT2010 1791 2017 12 26 00 00 00 854 69 0 87 1792 2017 12 26 00 20 00 855 76 0 87 1793
  • 为什么 smtplib.SMTP().sendmail 不发送 DKIM 签名邮件

    我已经在服务器上设置了 postfix 以及 openDKIM 当我跑步时 echo Testing setup mail s Postfix test my email address 我收到电子邮件 邮件标题中有一个DKIM Signa
  • 更改 Python Cmd 模块处理自动完成的方式

    我有一个 Cmd 控制台 设置为自动完成 Magic the Gathering 收藏管理系统的卡牌名称 它使用文本参数在数据库中查询卡片 并使用结果自动完成 建议卡片 然而 这些卡片名称有多个单词 Cmd 会从last到行尾的空间 例如
  • Django 模型:如何使用 mixin 类来覆盖 django 模型以实现 save 等功能

    我想在每次保存模型之前验证值 所以 我必须重写保存函数 代码几乎是一样的 我想把它写在 mixin 类中 但失败了 我不知道如何写 super func 我英语不好 抱歉 class SyncableMixin object def sav
  • 如何在单元测试中使用 JSON 发送请求

    我的 Flask 应用程序中有在请求中使用 JSON 的代码 我可以像这样获取 JSON 对象 Request request get json 这一直工作得很好 但是我正在尝试使用 Python 的 unittest 模块创建单元测试 但
  • 如何为所有用户安装 Anaconda python?

    Anaconda python 发行版 https store continuum io cshop anaconda 非常方便地部署科学计算环境 SCE 并根据需要切换python版本 默认情况下 安装会将 python 定位到 anac

随机推荐

  • 预构建事件后忽略 App.Config

    我有一个包含多个项目和多个开发人员的解决方案 每个开发人员都有自己的环境 当然 为了管理每个环境之间的连接字符串 我为每个环境创建了几个 app config 文件 app config dev app config qa 等 预构建事件只
  • Google Maps API v3:从数组添加标记不起作用

    首先感谢您考虑回答这个问题 非常感谢 我使用以下代码创建了一个地图 效果非常好 function initialize var mapOptions zoom 5 center new google maps LatLng 48 160 6
  • 模板不存在 Django

    我的 Django 模板位置列出为 python Lib site packages django contrib auth templates 在我看来我有 return render to response hello html nam
  • 通过代码 tradeview/pine 脚本隐藏图表、数量和信号标签上的交易

    每次我更新策略代码时 样式都会重置 这意味着 图表上的交易 信号标签 Quantity 被重置为显示 有没有办法覆盖该行为 以便我可以隐藏 图表上的交易 非常感谢您对这个看似微不足道的问题的帮助 不 默认情况下没有禁用它们的功能 前段时间我
  • MySQL 索引上的正则表达式

    我有查询在 where 子句中有多个正则表达式 where 子句中包含的列已被索引 但查询没有使用索引 MySql 正则表达式是否会导致使用索引 如果没有 解决方法是什么 不可以 正则表达式查找不能使用索引 如果您应用正则表达式的对象是索引
  • vectorize_sequences 的标准实现

    In 弗朗索瓦 肖莱 https fchollet com s 使用 Python 进行深度学习 https www manning com books deep learning with python 出现这个函数 def vector
  • 如何从类库中读取“System.ServiceModel”配置节组?

    有没有办法访问 System ServiceModel 客户端配置 即基于类 dll 项目中的app config ConfigurationManager GetSection string 允许您从执行应用程序的 app config
  • 空格键:如何在 if 语句中使用 and/or

    我有以下代码 div class div 如何在空格键模板的 if 条件中使用 AND OR 空格键无法处理逻辑表达式 因此您需要创建一个助手来为您处理计算 其实你可以实现and具有嵌套 if 的功能如下 if condition1 if
  • 如何在 Wix 安装程序中添加 url [LINK]

    我正在使用 Wix 工具集版本 3 7 我想在欢迎屏幕描述中添加一些指向产品网站的链接 如何实现这一目标 我认为你可以通过做这样的事情来做到这一点
  • 在交叉编译时我必须对 C++ 库做什么?

    这是我的配置的编译器部分 IF UNIX Compiler flags specify the cross compiler SET CMAKE C COMPILER home username projects buildroot out
  • 使用 fxml 文件设置anchorPane的内容

    我使用手风琴控件 根据标题窗格 我需要将 fxml 文件加载到锚窗格中 所以我有两部分 一部分用于手风琴 另一部分用于anchorPane 根据点击显示内容 FXML private StackPane tmpPane FXML priva
  • Gradle dagger lint:按包忽略

    我使用 Gradle 创建了一个 Android 项目 我添加了一个 Dagger 库 dependencies compile com squareup dagger dagger compiler 1 2 1 compile com s
  • 如何将react数据发布到express

    我正在尝试创建一个图书应用程序 我在前端做出反应 在后端使用节点js 当我尝试在后端创建时 它说无法 POST create 我该怎么办 该文件夹分为前端和后端 我正在使用 axios 我是 React js 的新手 请帮忙 我如何将 Re
  • 最高效的 CSS 选择器:标题标签、类还是 ID? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在不存储一副牌的情况下实现荷官类?

    Question 即使只有 52 张牌 permutationIndex我在其中描述的地方说明部分 将是一个巨大的数字 它是其中之一的数字52 需要29个字节来存储 Thus 我不知道一个简单的方法来计算permutationIndex一个
  • 作为 Android .apk 一部分的 Pdf 文件

    我必须构建一个 Android 应用程序来显示 pdf 文件列表 这些 pdf 文件应该受到保护 换句话说 应用程序的用户不应该能够通过任何方式 复制 剪切 打印 等 获取 pdf 内容的副本 我现在的问题是 我应该如何将 pdf 文件的内
  • 使用正则表达式标记字符串中的文本但排除链接

    我有一个文本 我希望当用户搜索某个术语时 通过用标记标签包裹该术语来突出显示该术语 javascript 来包装匹配项 var sampleText window document getElementById test innerHTML
  • java - 使用基类实例在派生类中访问受保护的成员

    我在派生类中创建了基类的实例并尝试访问受保护的成员 我可以直接访问派生类中的受保护成员 而无需实例化基类 基类 package com core public class MyCollection protected Integer int
  • 尝试在 Windows Phone 开发中心更新 XAP 时出错

    我正在尝试提交 Windows Phone 应用程序的更新 但是当我单击 更新应用程序 并选择相应的 xap 文件时 出现以下错误消息 ScriptObject InvokeFailed 参数 调试资源字符串不可用 通常 键和参数提供了足够
  • JSON 编码/解码 GTK 枚举

    我必须将自定义 GTK 元素的各种属性保存到文件中以供将来使用 并由于简单的格式和字典嵌套而决定使用 JSON 许多属性都是 GTK 枚举 例如gtk PAGE ORIENTATION PORTRAIT gtk ANCHOR CENTER