代码之家  ›  专栏  ›  技术社区  ›  Steve Cooper

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

  •  0
  • Steve Cooper  · 技术社区  · 14 年前

    我正在尝试使用 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 回复  |  直到 14 年前
        1
  •  3
  •   Katriel    14 年前

    您已经创建了新类并将其分配给全局变量 _newClass ,但您没有存储此变量!注意如果你这样做了 dynamictypes._newClass 将创建最终类型。

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

    globals()[ _className ] = _newClass
    

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

    顺便说一下,你的regex失败了 a4-page-template.tex ——你得到 a4PageTemplate 而不是 A4PageTemplate .