2010-08-11 55 views
0

我試圖使用type(,,)函數來動態構建模塊。該模塊創建表示模板的類,並且我需要爲生活在特定文件夾中的每個.tex文件創建一個新類。例如,如果我有一個a4-page-template.tex文件,我需要創建一個名爲A4PageTemplate的類。使用內置類型(,,)函數創建動態模塊

我可以使用type語句輕鬆創建類型;我到目前爲止看起來是這樣的;

# 
# 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

順便說一句,你的代碼 - 使用pandoc和乳膠 - 看起來很有趣。如果它是公開的,你在建造什麼? – loevborg 2010-08-11 14:54:37

+0

好吧,目前它不公開,但它可能是 - 如果我確實公開,我會在這裏發佈。它是一個用於windows的崇高文本文本編輯器的插件 - http://www.sublimetext.com - 可以用python編寫腳本。該插件允許您使用許多不同的LaTeX模板將降價文件轉換爲PDF。它依賴於pandoc和MikTeX。 – 2010-08-11 16:38:07

回答

3

您已創建新類並將其分配給全局變量_newClass,但不存儲此變量!注意,如果你做dynamictypes._newClass你會得到創建的最終類型。

你需要做一個變量來保存每一個新的類,在創建它:

globals()[ _className ] = _newClass 

這將註冊爲_className模塊中的全局變量,這樣就可以從外部訪問它。

順便說一句,你的正則表達式在a4-page-template.tex上失敗 - 你得到a4PageTemplate而不是A4PageTemplate

+0

這就是我錯過的!我不知道如何引用全局變量。 – 2010-08-11 13:28:25