【问题标题】:How can I make dir(obj) return non-function members in swig generated python classes?如何让 dir(obj) 在 swig 生成的 python 类中返回非函数成员?
【发布时间】:2012-09-09 17:53:45
【问题描述】:

我正在使用 swig 为 C++ 库生成 python 包装器。 我倾向于使用 ipython 以交互方式使用生成的 python 模块。

假设我有以下 C++ 类:

class test
{
    int num;
    int foo();
};

Swig 用 python 类包装了这个类:

class test:
    def foo():...
    __swig_getmethods__["num"] = ...
    __swig_setmethods__["num"] = ...
    .
    .
    .

与 ipython 交互使用时。我注意到制表符补全会成功找到“foo”,而不是“num”。

经过一番挖掘,我看到 ipython 使用“dir”方法来完成制表符。 swig 生成非函数类成员的方式是通过实现__setattr____getattr__。他们所做的只是检查__swig_set/getmethods__ 字典并返回值(如果找到)。 这就是为什么在尝试dir(test) 时不会返回像“num”这样的成员。

理想情况下,如果 swig 可以为它的每个类实现 __dir__,那就太好了。这样的东西可以添加到每个 swig 包装类中:

# Merge the two method dictionaries, and get the keys
__swig_dir__ = dict(__swig_getmethods__.items() + __swig_setmethods__.items()).keys()
# Implement __dir__() to return it plus all of the other members
def __dir__(self):
    return __dict__.keys() + __swig_dir__ 

我的问题:

  1. 有没有简单的方法让 dir() 函数也返回非函数成员?
  2. 如果对 1 的回答是否定的,是否有一种简单的方法可以在 swig 生成的每个 python 类中添加上述代码?

我知道这是一件小事,但在我看来,制表符补全对生产力有非常积极的影响。

谢谢

【问题讨论】:

  • 这个问题最好在邮件列表中询问。如果您编写一个快速 hack 以将成员添加到 __dict__,进行测试,然后发布,您可能会得到最积极的响应。
  • 我猜你是对的。我会尽力做到这一点。但与此同时,我希望有一个可能的解决方法。将上述代码插入每个生成的 python 类的一些方法。也许我会在一个单独的问题中问这个问题。谢谢。
  • 并不是说这个问题不好,而是说 SO 有时不是解决某些问题的理想场所,仅此而已。

标签: python swig


【解决方案1】:

IPython 将 dir 包装在 IPython/core/completer.py 内的新函数 dir2 中

所以你可以尝试重新定义 dir2。比如:

import IPython.core.completer
old_dir = IPython.core.completer.dir2

def my_dir(obj):
    methods = old_dir(obj)
    #merge your swig methods in
    return methods

IPython.core.completer.dir2 = my_dir

【讨论】:

  • 我已经知道...此代码已出现在我的问题中。我的问题是,如何让 swig 将此代码放入每个生成的 python 类中。
  • 抱歉。我一定误解了你两个问题的优先级。
  • 实际上,在再次查看您的答案后,似乎是我误解了,所以我很抱歉......您的意思是我应该覆盖全局 dir() 函数,而不是 per类 __dir__() 函数,对吧?虽然不是完美的解决方案,但这实际上是一个非常好的解决方法。我会尝试一下。谢谢!
  • 虽然在 ipython 中试用它,但它不起作用。尽管 dir 函数现在显示其他成员,但 ipython 中的制表符完成仍然没有。只有当我在类中实现 dir 时它才有效。不过还是谢谢。仍然是个好主意:)
  • 我已经重写了修改 IPython 解释器中的 dir2 函数的建议。
猜你喜欢
  • 1970-01-01
  • 2021-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多