Python: как выполнить сгенерированный код? - PullRequest
1 голос
/ 19 мая 2010

У меня есть этот код, и я хотел бы использовать параметр приложения для генерации кода вместо его дублирования.

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

Есть идеи?

Спасибо

Ответы [ 2 ]

6 голосов
/ 19 мая 2010

Я бы предпочел использовать идиому диспетчерского словаря, кодирующую что-то вроде ...:

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)

Не уверен, что то, что вы думаете, «генерация кода» купит вас, чтобы сделать его предпочтительным для такого подхода.

0 голосов
/ 19 мая 2010

Почему бы просто не передать функцию в определенную функцию?

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...