【问题标题】:Find functions explicitly defined in a module (python)查找在模块中明确定义的函数(python)
【发布时间】:2010-11-09 13:28:12
【问题描述】:

好的,我知道您可以使用 dir() 方法列出模块中的所有内容,但是有没有办法只查看该模块中定义的函数?例如,假设我的模块如下所示:

from datetime import date, datetime

def test():
    return "This is a real method"

即使我使用inspect() 过滤掉内置函数,我仍然会留下任何导入的内容。例如,我会看到:

['日期','日期时间','测试']

有没有办法排除进口?或者另一种方法来找出模块中定义的内容?

【问题讨论】:

标签: python introspection


【解决方案1】:

python 中的每个类都有一个__module__ 属性。您可以使用它的值来执行过滤。看看example 6.14 in dive into python

【讨论】:

  • 函数也有__module__属性。
【解决方案2】:

你在寻找这样的东西吗?

import sys, inspect

def is_mod_function(mod, func):
    return inspect.isfunction(func) and inspect.getmodule(func) == mod

def list_functions(mod):
    return [func.__name__ for func in mod.__dict__.itervalues() 
            if is_mod_function(mod, func)]


print 'functions in current module:\n', list_functions(sys.modules[__name__])
print 'functions in inspect module:\n', list_functions(inspect)

编辑:将变量名称从“meth”更改为“func”以避免混淆(我们在这里处理的是函数,而不是方法)。

【讨论】:

  • @ars 你不能用[f[1] for f in inspect.getmembers(mod) if inspect.isfunction(f[1])] 替换你的函数并得到相同的结果吗?
  • 没关系,包括导入的函数,仍然需要getmodule(func) == mod 才能工作,但仍然是单线。
  • 有没有办法使用装饰函数来完成这项工作?
【解决方案3】:

您可以检查相关函数的__module__ 属性。我说“函数”是因为方法通常属于一个类;-)。

顺便说一句,一个类实际上也有__module__ 属性。

【讨论】:

    【解决方案4】:

    以下内容如何:

    grep ^def my_module.py
    

    【讨论】:

    • 这是一个快速而有效的解决方案。它可能不是解决您的问题的最佳解决方案,但我不知道,因为我不知道您要解决什么问题。
    【解决方案5】:

    python inspect 模块可能就是您在这里寻找的。​​p>

    import inspect
    if inspect.ismethod(methodInQuestion):
        pass # It's a method
    

    【讨论】:

    • 看起来它可以与 Stefano 的回答结合使用。你可以看到什么是方法,什么是导入的。
    • 我正在评论这篇文章,因为我的代表未满 50 岁。函数也具有 module 属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    相关资源
    最近更新 更多