Python 使用内置类型(,)函数创建动态模块

Python 使用内置类型(,)函数创建动态模块,python,module,metaprogramming,python-module,Python,Module,Metaprogramming,Python Module,我正在尝试使用该函数动态构建一个模块。该模块创建表示模板的类,我需要为位于特定文件夹中的每个.tex文件创建一个新类。例如,如果我有一个a4page template.tex文件,我需要创建一个名为a4page template的类 我可以使用type语句轻松地创建类型;到目前为止,我所拥有的是这样的 # # dynamictypes.py # import os, re _requiredEnd = "-template.tex" _packageDir = "C:\\Users\\...

我正在尝试使用该函数动态构建一个模块。该模块创建表示模板的类,我需要为位于特定文件夹中的每个
.tex
文件创建一个新类。例如,如果我有一个
a4page template.tex
文件,我需要创建一个名为
a4page template
的类

我可以使用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'>
我得到这个错误

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'
回溯(最近一次呼叫最后一次):
文件“C:\Users\steve.cooper\Desktop\driver.py”,第3行,在
myTemplate=dynamictypes.PandocA4BookTemplate()
AttributeError:“模块”对象没有属性“PandocA4BookTemplate”

您能想出一种方法让我将我创建的类型添加到模块中,使其成为模块的一流部分吗?

您已经创建了新类并将其分配给全局变量
\u newClass
,但您没有存储此变量!请注意,如果执行
dynamictypes.\u newClass
操作,将创建最终类型

创建每个新类时,需要创建一个变量来保存它:

globals()[ _className ] = _newClass
这会将_className注册为模块中的全局变量,以便您可以从外部访问它


顺便说一下,您的正则表达式在
a4页模板.tex上失败--您得到的是
a4page模板
,而不是
a4page模板
,您创建了新类并将其分配给全局变量
\u newClass
,但您没有存储此变量!请注意,如果执行
dynamictypes.\u newClass
操作,将创建最终类型

创建每个新类时,需要创建一个变量来保存它:

globals()[ _className ] = _newClass
这会将_className注册为模块中的全局变量,以便您可以从外部访问它


顺便说一下,您的正则表达式在
a4页模板上失败。tex
——您得到的是
a4page模板
,而不是
a4page模板

,这就是我所缺少的!我不知道怎么称呼globals,这就是我所缺少的!我不知道如何引用globals。顺便说一下,你的代码——使用pandoc和latex——看起来很有趣。什么,如果它是公开的,你在建吗?嗯,现在它不是公开的,但它可能是--如果我公开的话,我会在这里发布。它是用于windows的sublime文本编辑器的插件,可以用python编写脚本。该插件允许您使用许多不同的LaTeX模板将标记文件转换为PDF。它依赖于pandoc和MikTeX。顺便说一下,你的代码——使用pandoc和latex——看起来很有趣。什么,如果它是公开的,你在建吗?嗯,现在它不是公开的,但它可能是--如果我公开的话,我会在这里发布。它是用于windows的sublime文本编辑器的插件,可以用python编写脚本。该插件允许您使用许多不同的LaTeX模板将标记文件转换为PDF。它依赖于pandoc和MikTeX。