Использование встроенной функции типа (,,) для создания динамического модуля - PullRequest
0 голосов
/ 11 августа 2010

Я пытаюсь использовать функцию type(,,) для динамического построения модуля. Модуль создает классы, представляющие шаблоны, и мне нужен новый класс для каждого файла .tex, который находится в определенной папке. Например, если у меня есть файл a4-page-template.tex, мне нужно создать класс с именем A4PageTemplate.

Я могу достаточно легко создать тип, используя оператор типа; что у меня до сих пор выглядит так;

#
# dynamictypes.py
# 
import os, re

_requiredEnd = "-template.tex"
_packageDir = "C:\\Users\\...";

def _getClassName(name):
  return re.sub("-(.)", lambda m: m.group(1).upper() , name) + "Template"

for file in os.listdir(_packageDir):
  if file.lower().endswith(_requiredEnd):
    _fileWithoutExt = file[:-len(_requiredEnd)]
    _className = _getClassName(_fileWithoutExt)
    _newClass = type(_className, (object,), dict(template=file))
    print _newClass

Обратите внимание, что предпоследняя строка создает тип, а оператор print, следующий за ним, показывает, что тип создан для каждого шаблона;

<class 'dynamictypes.PandocA4BookTemplate'>
<class 'dynamictypes.PandocBookTemplate'>
<class 'dynamictypes.PandocCompactTemplate'>

Однако, когда я использую модуль, я не могу использовать тип; если я напишу этот потребительский скрипт;

import dynamictypes

myTemplate = dynamictypes.PandocA4BookTemplate()

Я получаю эту ошибку;

Traceback (most recent call last):
  File "C:\Users\steve.cooper\Desktop\driver.py", line 3, in <module>
    myTemplate = dynamictypes.PandocA4BookTemplate()
AttributeError: 'module' object has no attribute 'PandocA4BookTemplate'

Можете ли вы придумать, как мне добавить созданный мной тип в модуль, чтобы он был первоклассной частью модуля?

1 Ответ

3 голосов
/ 11 августа 2010

Вы создали новый класс и присвоили его глобальной переменной _newClass, но вы не храните эту переменную! Обратите внимание, что если вы сделаете dynamictypes._newClass, вы получите последний созданный тип.

Вам нужно создать переменную для хранения каждого нового класса, как вы его создаете:

globals()[ _className ] = _newClass

Это регистрирует _className как глобальную переменную в модуле, чтобы вы могли получить к ней доступ извне.

Кстати, ваше регулярное выражение не работает на a4-page-template.tex - вместо A4PageTemplate.

вы получаете a4PageTemplate.
...