метапрограммирование на питоне - PullRequest
4 голосов
/ 20 марта 2010

Я пытаюсь заархивировать задачу, которая оказывается немного сложной, поскольку я не очень хорош в метапрограммировании Python.

Я хочу иметь модуль locations с функцией get_location(name), который возвращает класс, определенный в расположении папки / в файле с именем, переданным функции. Имя класса - это что-то вроде NameLocation.

Итак, структура моей папки:

program.py
locations/
    __init__.py
    first.py
    second.py

program.py будет что-то с:

from locations import get_location
location = get_location('first')

и расположение это класс, определенный в first.py что-то вроде этого:

from locations import Location # base class for all locations, defined in __init__ (?)
class FirstLocation(Location):
    pass

и т.д.

Хорошо, я перепробовал множество операторов import и getattribute , но теперь мне скучно и я сдаюсь. Как заархивировать такое поведение?


Не знаю почему, но этот код

def get_location(name):
   module = __import__(__name__ + '.' + name)
   #return getattr(module, titlecase(name) + 'Location')
   return module

возвращает

>>> locations.get_location( 'first')
<module 'locations' from 'locations/__init__.py'>

модуль локаций! почему?!

Ответы [ 2 ]

6 голосов
/ 20 марта 2010

Вам нужно __import__ модуль;после этого получить attr от него не сложно.

import sys

def get_location(name):
    fullpath = 'locations.' + name
    package = __import__(fullpath)
    module = sys.modules[fullpath]
    return getattr(module, name.title() + 'Location')

Edit : __import__ возвращает пакет, поэтому вам нужен еще один getattr, см. docs (и внимательно прочитайте весь раздел - "делай, как я говорю, не так, как я"; -).

1 голос
/ 20 марта 2010

Я думаю, что вы ищете:

location = __import__('first')
...