'宣言型Python'で役立ちます。たとえば、以下のFooDef
クラスBarDef
は、一連のデータ構造を定義するために使用され、パッケージによって入力または構成として使用されます。これにより、入力内容に多くの柔軟性がもたらされ、パーサーを作成する必要がなくなります。
# FooDef, BarDef are classes
Foo_one = FooDef("This one", opt1 = False, valence = 3 )
Foo_two = FooDef("The other one", valence = 6, parent = Foo_one )
namelist = []
for i in range(6):
namelist.append("nm%03d"%i)
Foo_other = FooDef("a third one", string_list = namelist )
Bar_thing = BarDef( (Foo_one, Foo_two), method = 'depth-first')
この構成ファイルは、ループを使用して、の構成の一部である名前のリストを作成することに注意してくださいFoo_other
。したがって、この構成言語には、利用可能なランタイムライブラリを備えた非常に強力な「プリプロセッサ」が付属しています。たとえば、複雑なログを検索したり、zipファイルからデータを抽出してbase64でデコードしたりする場合は、構成の生成の一部として行います(もちろん、入力が信頼できないソース...)
パッケージは、次のようなものを使用して構成を読み取ります。
conf_globals = {} # make a namespace
# Give the config file the classes it needs
conf_globals['FooDef']= mypkgconfig.FooDef # both of these are based ...
conf_globals['BarDef']= mypkgconfig.BarDef # ... on .DefBase
fname = "user.conf"
try:
exec open(fname) in conf_globals
except Exception:
...as needed...
# now find all the definitions in there
# (I'm assuming the names they are defined with are
# significant to interpreting the data; so they
# are stored under those keys here).
defs = {}
for nm,val in conf_globals.items():
if isinstance(val,mypkgconfig.DefBase):
defs[nm] = val
したがって、最終的に要点を理解することは、globals()
そのようなパッケージを使用するときに、一連の定義を手続き的に作成する場合に役立ちます。
for idx in range(20):
varname = "Foo_%02d" % i
globals()[varname]= FooDef("one of several", id_code = i+1, scale_ratio = 2**i)
これは書き出すのと同じです
Foo_00 = FooDef("one of several", id_code = 1, scale_ratio=1)
Foo_01 = FooDef("one of several", id_code = 2, scale_ratio=2)
Foo_02 = FooDef("one of several", id_code = 3, scale_ratio=4)
... 17 more ...
Pythonモジュールから一連の定義を収集して入力を取得するパッケージの例はPLY(Python-lex-yacc)http://www.dabeaz.com/ply/ です。この場合、オブジェクトはほとんど関数です。オブジェクトですが、関数オブジェクトのメタデータ(名前、docstring、定義の順序)も入力の一部を形成します。を使用するための良い例ではありませんglobals()
。また、その逆ではなく、「構成」(後者は通常のPythonスクリプト)によってインポートされます。
私が取り組んできたいくつかのプロジェクトで「宣言型Python」を使用globals()
し、それらの構成を作成するときに使用する機会がありました。これは、構成「言語」の設計方法の弱点によるものであると確かに主張できます。このように使用globals()
しても、明確な結果は得られません。ほぼ同一のステートメントを12個書き出すよりも維持しやすい結果だけです。
また、名前に従って、構成ファイル内で変数に重要性を与えるために使用することもできます。
# All variables above here starting with Foo_k_ are collected
# in Bar_klist
#
foo_k = [ v for k,v in globals().items() if k.startswith('Foo_k_')]
Bar_klist = BarDef( foo_k , method = "kset")
このメソッドは、多くのテーブルと構造を定義するPythonモジュールに役立ち、参照も維持することなく、データにアイテムを簡単に追加できるようになります。