使用内置 type(,,) 函数创建动态模块

Posted

技术标签:

【中文标题】使用内置 type(,,) 函数创建动态模块【英文标题】:Using built-in type(,,) function to create a dynamic module 【发布时间】:2011-03-28 09:13:50 【问题描述】:

我正在尝试使用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'

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

【问题讨论】:

顺便说一句,您的代码 - 使用 pandoc 和 latex - 看起来很有趣。如果它是公开的,你在建造什么? 嗯,它目前不公开,但它可能是——如果我公开它,我会在这里发布。它是一个用于 Windows 的 sublime 文本编辑器的插件——sublimetext.com——可以用 python 编写脚本。该插件允许您使用许多不同的 LaTeX 模板将 Markdown 文件转换为 PDF。它依赖于 pandoc 和 MikTeX。 【参考方案1】:

您已创建新类并将其分配给全局变量_newClass,但您并未存储此变量!请注意,如果您执行dynamictypes._newClass,您将获得创建的最终类型。

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

globals()[ _className ] = _newClass

这会将_className注册为模块中的全局变量,以便您可以从外部访问它。

顺便说一句,您的正则表达式在a4-page-template.tex 上失败——您得到的是a4PageTemplate 而不是A4PageTemplate

【讨论】:

这就是我所缺少的!我不知道如何引用全局变量。

以上是关于使用内置 type(,,) 函数创建动态模块的主要内容,如果未能解决你的问题,请参考以下文章

python26 封装 多态 常用的内置函数 `__str__` `__del__` 反射 动态导入模块

python内置函数与模块

Python-内置函数

06Python 内置函数redisyagmailnnlog导入模块的实质

匿名函数内置函数与模块

Python 的内置函数__import__