python 代码中的 SwigPyObject 和 JSON 通信

发布于 2024-11-02 19:01:00 字数 833 浏览 5 评论 0原文

简介。 我有一个 C++ 应用程序,我使用 SWIG 来启动在 python 代码中定义的 GetObjectsPutObjects 方法。 GetObjects 方法打开 JSON 格式的文件,从那里获取对象并将它们返回到 C++ 应用程序。当 PutObjects 方法从 C++ 应用程序获取对象时,打开 JSON 格式的文件进行写入并将它们存储在那里。

该代码非常常见,使用 MyJSONDecode 和 MyJSONEncode 函数在 python 对象和 json 字典之间进行交互。

现在问题来了。 Swig 将 MyObject C++ 类转换为位于 abc 模块中名为 MyObject 的 Python 类。我使用 import abc 语句在 abc.MyObject() 等代码中进一步使用它。 abc.MyObject 是一个 SwigPyObject 并且它本身没有字典(__dict__ 成员)。

因此,我无法在 MyJSONEncode 函数内迭代 MyObject.__dict__ 来构建应该由函数返回的字典,从而创建 JSON 格式。

但 MyObject 有属性,例如 url 或名称等。如何迭代属性?

如果需要的话我会给你代码。请告诉我。我也希望,总的来说,我的问题得到理解。

等待友好的回复:)

Intro.
I have a C++ application, I use SWIG to launch GetObjects and PutObjects methods which are defined in python code. GetObjects method opens JSON formated file, takes objects from there and returns back them to C++ application. While the PutObjects method gets objects from C++ application, opens JSON formated file for writing and stores them over there.

The code is pretty common and uses MyJSONDecode and MyJSONEncode functions to interact between python objects and json dictionaries.

Now the problem.
Swig converts MyObject C++ class into python class called MyObject located in abc module. I use import abc statement to use it further in code like abc.MyObject().
abc.MyObject is a SwigPyObject and it does not have dictionary itself (__dict__ member).

So I can't iterate through MyObject.__dict__ inside MyJSONEncode function to build up a dictionary which should be returned by the function and therefore to create a JSON format.

But MyObject has properties, for example url or name and so on. How can I iterate through properties ?

If needed, I will provide you with code. Just let me know. Also I hope, in general, my problem is understood.

Waiting for kind response :)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

落叶缤纷 2024-11-09 19:01:00

您应该能够使用“dir”函数来获取对象的属性列表。

这是获取所有非功能用户创建的属性(称为“属性”)的示例:

import inspect

class MyObject(object):
    def __init__(self):
        self.b = 1
        self.c = 'a'
    def func(self):
        pass

obj = MyObject()
# Get all the user created attributes for the object
attributes = [d for d in dir(obj)
              if not d.startswith('__')]
# Filter those to get the non functions
properties = [a for a in attributes
              if not inspect.ismethod(getattr(obj,a))]

You should be able to use the "dir" function to get a list of attributes of an object.

Here is example which grabs all non function user created attributes (called "properties"):

import inspect

class MyObject(object):
    def __init__(self):
        self.b = 1
        self.c = 'a'
    def func(self):
        pass

obj = MyObject()
# Get all the user created attributes for the object
attributes = [d for d in dir(obj)
              if not d.startswith('__')]
# Filter those to get the non functions
properties = [a for a in attributes
              if not inspect.ismethod(getattr(obj,a))]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文