如何列出 Python 模块的所有函数而忽略模块导入的函数?

How do I list all functions for a Python module ignoring functions the module imports?

我有一个 Python 模块 'something.py',我想获得我在此文件中编写的所有函数的列表。我已经按照 this SO post 解释了执行此操作的标准方法。

问题是我在 something.py 中有导入函数,所以在尝试列出我的函数时,我也列出了我不关心的导入函数。如何获得我在 something.py 中编写的函数列表?

import <modulename>
dir(modulename)

第二行代码将给出模块中存在的函数列表

例如:

import math
dir(math)
['__doc__', '__name__', '__package__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'hypot', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']

您可以使用 dir(yourModule) return 属性列表:https://docs.python.org/3/library/functions.html#dir

getmembers()函数包含导入函数,所以您需要更多。一种想法是检查函数的模块名称。

from inspect import getmembers, isfunction
import something
import sys

mod = something

funcs = [
    f
    for _, f in getmembers(mod, isfunction)
    if f.__module__ == mod.__name__
]

for f in funcs:
    print(f)

或者您可以改为使用此条件进行过滤:

if sys.modules[f.__module__] is mod

无论哪种方式,输出都是:

<function bar at 0x107fb05f0>
<function foo at 0x107f840e0>

我的 something 模块有这个:

import sys
from textwrap import dedent

fubb = 1

def foo():
    pass

def bar():
    pass

this answer--Find functions explicitly defined in a module 中的函数从 Python 2 更新到 3(即将 itervalues() 替换为 values():

def is_mod_function(mod, func):
    ' checks that func is a function defined in module mod '
    return inspect.isfunction(func) and inspect.getmodule(func) == mod


def list_functions(mod):
    ' list of functions defined in module mod '
    return [func.__name__ for func in mod.__dict__.values() 
            if is_mod_function(mod, func)]

用法

print(list_functions(something))  # Output: ['a1', 'b1']

文件main.py(主模块)

import inspect
import something  # project module

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__.values() 
            if is_mod_function(mod, func)]

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


# Get list of functions defined only in module something
print(list_functions(something))

文件something.py(某模块)

from textwrap import dedent
from math import sin, cos
import numpy as np

def a1():
  pass

def b1():
  pass

输出

['a1', 'b1']  # shows only the functions defined in something.py