【问题标题】:Helper function injected on all python objects?在所有python对象上注入辅助函数?
【发布时间】:2014-08-01 13:09:14
【问题描述】:

我试图从 Ruby 中模仿 methods.grep,它只返回一个可用方法列表,用于调用的任何对象(类或实例),并通过传递给 grep 的正则表达式模式进行过滤。 在交互式提示中调查对象非常方便。

def methods_grep(self, pattern):
    """ returns list of object's method by a regexp pattern """
    from re import search
    return [meth_name for meth_name in dir(self) \
            if search(pattern, meth_name)]

由于我不太清楚 Python 的限制,很遗憾它不能简单地插入到 object 类祖先中:

object.mgrep = classmethod(methods_grep)
# TypeError: can't set attributes of built-in/extension type 'object'

是否有一些解决方法如何注入所有类,还是我必须坚持使用像 dir 这样的全局函数?

【问题讨论】:

  • 您可以使用dir() 列出对象具有的所有方法,例如dir(some_object)(编辑:好的,我知道你已经知道了;)
  • @James 我知道,它在示例methods_grep 函数中使用。我需要一个对所有对象都可用的函数,它返回所有可用的方法过滤由作为参数给出的模式。
  • @James 例如str.mgrep('split') 将返回['_formatter_field_name_split', 'rsplit', 'split', 'splitlines']
  • 您可能会使用mock 模块来伪造它,尽管除了处理mgrep 方法之外,设置一个Mock 将所有内容委托给原始object 类型可能有点冒险也是。

标签: python inheritance python-3.x metaprogramming monkeypatching


【解决方案1】:

有一个名为forbiddenfruit 的模块可以让您修补内置对象。它还允许您撤消更改。你可以在这里找到它https://pypi.python.org/pypi/forbiddenfruit/0.1.1

from forbiddenfruit import curse    
curse(object, "methods_grep", classmethod(methods_grep))

当然,在生产代码中使用它可能是个坏主意。

【讨论】:

  • 谢谢,看起来很有趣。该模块在生产使用中有什么问题?性能问题?
  • 请注意,这不是一个纯 Python 模块。它是 Python 的 C 插件。这至少使其与不同 Python 版本的兼容性降低。 +1,因为它回答了问题。
  • @David 我指的是修改内置类型的一般做法。出于您声明的目的,它可能是无害的。
【解决方案2】:

AFAIK 没有解决方法。我觉得你不能改变内置类很烦人。不过个人意见。

一种方法是创建一个基础对象并强制所有对象从它继承。

但老实说,我看不出问题所在。你可以简单地使用methods_grep(object, pattern),对吧?您不必在任何地方插入它。

【讨论】:

  • 这对于使用您的库的其他人来说既安全又不易出错。
  • 谢谢。我认为我需要坚持这一点并将其保留为全局函数。
猜你喜欢
  • 2021-05-24
  • 2017-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 2015-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多