有没有办法以编程方式确定在python模块中声明函数的顺序?

时间:2013-10-11 15:00:17

标签: python

我正在开发一个能够发现类中函数声明顺序的项目非常有用。基本上,我希望能够保证类中的所有函数都按它们声明的顺序执行。

最终结果是一个网页,其中函数输出的顺序与声明函数的顺序相匹配。该类将继承自将其定义为网页的通用基类。 Web应用程序将动态加载.py文件。

2 个答案:

答案 0 :(得分:4)

class Register(object):
    def __init__(self):
        self._funcs = []

    def __call__(self, func):
        self._funcs.append(func)
        return func


class MyClass(object):

     _register = Register()

     @_register
     def method(self, whatever):
         yadda()

     # etc

答案 1 :(得分:2)

from types import MethodType, FunctionType
methodtypes = set((MethodType, FunctionType, classmethod, staticmethod))

def methods_in_order(cls):
    "Given a class or instance, return its methods in the order they were defined."
    methodnames = (n for n in dir(cls) if type(getattr(cls, n)) in methodtypes)
    return sorted((getattr(cls, n) for n in methodnames), 
                  key=lambda f: getattr(f, "__func__", f).func_code.co_firstlineno)

用法:

class Foo(object):
    def a(): pass
    def b(): pass
    def c(): pass

print methods_in_order(Foo)
[<unbound method Foo.a>, <unbound method Foo.b>, <unbound method Foo.c>]

也适用于实例:

print methods_in_order(Foo())

如果在不同的源文件中定义了任何继承的方法,则排序可能不一致(因为排序依赖于每个方法在其自己的源文件中的行号)。这可以通过手动遍历类的方法解析顺序来纠正。这会更复杂,所以我不会在这里拍摄。

或者,如果您只想要在类上直接定义的那些,这似乎对您描述的应用程序有用,请尝试:

from types import MethodType, FunctionType
methodtypes = set((MethodType, FunctionType, classmethod, staticmethod))

def methods_in_order(cls):
    "Given a class or instance, return its methods in the order they were defined."
    methodnames = (n for n in (cls.__dict__ if type(cls) is type else type(cls).__dict__)
                   if type(getattr(cls, n)) in methodtypes)
    return sorted((getattr(cls, n) for n in methodnames), 
                  key=lambda f: getattr(f, "__func__", f).func_code.co_firstlineno)

这假定是一种新式的类。