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

最後から2番目の行がタイプを作成し、それに続く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'

作成したタイプをモジュールに追加して、モジュールのファーストクラスの部分にする方法を考えてみてください。

4

1 に答える 1

3

新しいクラスを作成してグローバル変数に割り当てましたが、_newClassこの変数は保存していません。dynamictypes._newClassそうすると、最終的なタイプが作成されることに注意してください。

新しいクラスを作成するときに、それぞれの新しいクラスを保持する変数を作成する必要があります。

globals()[ _className ] = _newClass

これにより、_classNameがモジュール内のグローバル変数として登録されるため、外部からアクセスできます。

ちなみに、正規表現は失敗します-の代わりにa4-page-template.tex取得します。a4PageTemplateA4PageTemplate

于 2010-08-11T13:26:11.447 に答える