2010-05-19 90 views
1

我有这段代码,我想用app参数来生成代码而不是重复它。Python:如何执行生成的代码?

if app == 'map': 
    try: 
     from modulo.map.views import map 
     return map(request, *args, **kwargs) 
    except ImportError: 
     pass 

elif app == 'schedule': 
    try: 
     from modulo.schedule.views import schedule 
     return schedule(request, *args, **kwargs) 
    except ImportError: 
     pass 

elif app == 'sponsors': 
    try: 
     from modulo.sponsors.views import sponsors 
     return sponsors(request, *args, **kwargs) 
    except ImportError: 
     pass 

elif app == 'streaming': 
    try: 
     from modulo.streaming.views import streaming 
     return streaming(request, *args, **kwargs) 
    except ImportError: 
     pass 

你有什么想法吗?

感谢

+0

“生成”可能不是要走的路。使用一些内省更安全和简单。 – Thomas 2010-05-19 18:01:32

回答

6

我宁愿使用派遣词典成语,编码类似...:

import sys 

dispatch = { 'map': ('modulo.map.views', 'map'), 
      'schedule': ('modulo.schedule.views', 'schedule_day'), 
      ...etc etc.. } 
if app in dispatch: 
    modname, funname = dispatch[app] 
    try: __import__(modname) 
    except ImportError: pass 
    else: 
    f = getattr(sys.modules[modname], funname, None) 
    if f is not None: 
     return f(request, *args, **kwargs) 

不知道你在想什么“代码生成”会买你做出更可取到这种方式。

+1

在第二行代码中,您在'地图'后有一个逗号,而不是逗号) – systemovich 2010-05-20 13:53:40

+0

Tx,已编辑并修复。 – 2010-05-20 15:57:07

+0

使用'modname ='modulo。%s.views'%app'和'funname = app'它变成了我正在寻找的东西。谢谢 – Natim 2010-05-29 09:41:52

0

为什么不把函数传递到特定函数?

def proc_app(request, app, *args, **kwargs): 
    return app(request, *args, **kwargs): 

def view_1(request): 
    from modulo.map.views import map 
    return proc_app(request, map, *args, **kwargs) 

def view_2(request): 
    from modulo.schedule.views import schedule_day 
    return proc_app(request, schedule_day, *args, **kwargs)