检索脚本中的可用功能(相同顺序)

时间:2019-02-04 17:11:37

标签: python python-3.x

我正在清除一些污迹化的数据,因此我想对其自动化一些。也就是说,我希望脚本具有一些预定义的清除函数,以便按应如何清除数据的顺序进行处理,并且设计了一个装饰器,以使用this solution从脚本中检索这些函数:

from inspect import getmembers, isfunction
import cd # cleaning module
functions_list = [o[0] for o in getmembers(cd) if isfunction(o[1])]

这非常好用。但是,它确实以不同的顺序(by name)检索函数

出于可重复性目的,请将以下清洁模块视为cd

def clean_1():
    pass


def clean_2():
    pass


def clean_4():
    pass


def clean_3():
    pass

解决方案输出:

['clean_1', 'clean_2', 'clean_3', 'clean_4']

需要的位置:

['clean_1', 'clean_2', 'clean_4', 'clean_3']

可以解决主要问题的其他解决方案(不过考虑了性能)。

2 个答案:

答案 0 :(得分:2)

您在那儿。您只需要根据函数代码对象([Python 3]: inspect - Inspect live objects)的1 st 行对列表进行排序。

请注意,我仅在问题的(简单)示例中尝试过此操作(并且未进行任何性能测试)。

code.py

#!/usr/bin/env python3

import sys 
from inspect import getmembers, isfunction
import cd  # The module from the question that contains the 4 clean_* functions


def main():
    member_functions = (item for item in getmembers(cd) if isfunction(item[1]))
    function_names = (item[0] for item in sorted(member_functions, key=lambda x: x[1].__code__.co_firstlineno))
    print(list(function_names))


if __name__ == "__main__":
    print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
    main()

输出

e:\Work\Dev\StackOverflow\q054521087>"e:\Work\Dev\VEnvs\py_064_03.06.08_test0\Scripts\python.exe" code.py
Python 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] on win32

['clean_1', 'clean_2', 'clean_4', 'clean_3']

答案 1 :(得分:1)

  

可以解决主要问题的其他解决方案(不过考虑了性能)。

为了能够在不自动包含帮助功能的情况下定义和导入帮助功能,如何使用显式列表:

def clean_1():
    pass


def clean_2():
    pass


def clean_4():
    pass


def clean_3():
    pass


cleaners = [
    clean_1,
    clean_2,
    clean_4,
    clean_3,
]

或显式装饰器:

cleaners = []
cleaner = cleaners.append


@cleaner
def clean_1():
    pass


@cleaner
def clean_2():
    pass


@cleaner
def clean_4():
    pass


@cleaner
def clean_3():
    pass

不过,就按顺序获取常规模块的属性而言,您应该能够在Python 3.7+中使用__dict__

functions_list = [k for k, v in cd.__dict__.items() if isfunction(v)]