2010-05-16 64 views
3

我在我的python脚本中有一个未知数量的函数(当然,它是已知的,但不是常量),它以站点_... 开头我想知道是否还有一段路要走通过一些主要功能中的所有这些功能来调用它们。 类似:在Python中执行一些函数

foreach function_that_has_site_ as coolfunc 
    if coolfunc(blabla,yada) == true: 
     return coolfunc(blabla,yada) 

所以它会去通过他们所有,直到它得到的东西是真的。

谢谢!

+1

请注意,你可能会更好试图做这一种不同的方式 - 为实例,而不是将它们全部定义为名为'site_ZZZZ'的顶级函数,而是将它们存储为函数的列表或字典。 – Amber 2010-05-16 08:49:56

回答

5

inspect模块,在其他的答案已经提到的,因为你可以轻松地过滤你关心对象的名称和值是特别方便。 inspect.getmembers需要参数:其成员你探索的对象,一个谓词(函数返回bool)将接受(返回True的)只有你关心的对象。

得到你需要以下众所周知的成语“也就是这个模块对象”:

import sys 
this_module = sys.modules[__name__] 

在你的谓词,您只需要选择哪些是函数对象,并具有与site_开头的名称:

import inspect 
def function_that_has_site(f): 
    return inspect.isfunction(f) and f.__name__.startswith('site_') 

在掌握这两个项目,你的循环就变成了:

for n, coolfunc in inspect.getmembers(this_module, function_that_has_site): 
    result = coolfunc(blabla, yada) 
    if result: return result 

我还分割了循环体,以便每个函数只被调用一次(这既节省了时间是一种更安全的方法,避免了可能的副作用)...以及在Python ;-)重新措辞它

+0

http://codepad.org/gq4ZYJPJ 得到 result = funcme() TypeError:'tuple'对象不可调用 有没有我在这里失踪的东西? – Asaf 2010-05-17 19:03:03

+0

@asaf,我的不好 - 我在'for'循环中有个拼写错误(它需要分别获取名称和函数)。现在编辑并修复它,添加'n'部分。 – 2010-05-17 19:41:26

+0

添加n,错误: result = funcme() TypeError:'NoneType'对象不可调用 – Asaf 2010-05-17 20:14:33

3

您是否尝试过使用检查模块?

http://docs.python.org/library/inspect.html

下将返回方法:

inspect.getmembers 

然后,你可以调用与:

methodobjToInvoke = getattr(classObj, methodName) 
methodobj("arguments") 
0

尝试dir()globals()locals()。或者inspect模块(如上所述)。

def site_foo(): 
    pass 

def site_bar(): 
    pass 

for name, f in globals().items(): 
    if name.startswith("site_"): 
    print name, f() 
1

这种方法经过当前模块的所有属性,并且执行它与起始site_名称查找所有功能:

import sys 
import types 
for elm in dir(): 
    f = getattr(sys.modules[__name__], elm) 
    if isinstance(f, types.FunctionType) and f.__name__[:5] == "site_": 
     f() 

功能型检查是不必要的,如果只功能是具有名称从site_开始。

1
def run(): 
    for f_name, f in globals().iteritems(): 
     if not f_name.startswith('site_'): 
      continue 
     x = f() 
     if x: 
      return x 
1

这是最好用装饰列举你所关心的功能:

_funcs = [] 

def enumfunc(func): 
    _funcs.append(func) 
    return func 

@enumfunc 
def a(): 
    print 'foo' 

@enumfunc 
def b(): 
    print 'bar' 

@enumfunc 
def c(): 
    print 'baz' 

if __name__ == '__main__': 
    for f in _funcs: 
    f()