UMAの備忘録

Linuxやら大気科学やらについてゆるりと。

【Python】別ファイルの変数を使う方法(Fortranのnamelist)

どうも、UMAです。
久しぶり(マジで久しぶり)にプログラミング関係の記事になります。


今回はPythonについてです。

僕は元々Fortranユーザで、Pythonでも多重ループなどの重たい処理は
PythonFortranを組み込んで実行するといったことをよくやります。

そのFortranでよく使う「namelist」と同じことをPythonでやろう、というのが今回の内容です。


namelistとは

Fortranの便利機能に「namelist」というものがあります。

これは、別ファイルに変数や定数をまとめておいて、コンパイル済みのプログラムを
実行時に読み込むことで、コンパイルし直さなくても処理を変えられる仕組みです。

例えば、次のような感じでnamelistを作成します。

&param00
  var01 = 0.0
  var02 = 1.0
/

これをメインプログラムで読み込むと、メインの方で var01 となっているところは「 0.0 」、
var02 となっているところは「 1.0 」であるとして処理されます。


この機能はコンパイラ言語であるFortranならではですが、例えばPythonでも、
実行する時にソースコードをできるだけいじりたくない場合などに使えると便利です。

では、このnamelistを実際にPythonではどのように実装するか、次から解説していきます。


Pythonでnamelistを実装する

Pythonで別ファイルの変数を使うには、次のようにします。
まず、ファイル「 sub.py 」には以下の内容が記載されているとします。

var01 = 0.0
var02 = 1.0

これらの変数をファイル「 main.py 」で使用するには、こう書きます。

import sub

print( sub.var01 )
print( sub.var02 )

main.py を実行すると、「 0.0 」と「 1.0 」が標準出力されるはずです。


ただ、これだと別ファイルの変数がすべて読み込まれてしまいます。
Fortranのnamelistのように、カテゴリ分けして必要なところだけを読む方が便利です。

そこで、Pythonclass を使って次のように書くと、かなりnamelist感が出ます。
ファイル名を「namelist.py」として、

class param00 :
    var01 = 0.0
    var02 = 1.0

class param01 :
    var11 = 4.0
    var12 = 9.0

そして、これらを使用するには

from namelist import param00
from namelist import param01

print( param00.var01 + param00.var02 )
print( param01.var11 * param01.var12 )

のように書きます。(「 1.0 」と「 36.0 」が出力されるはずです。)


上記のような方法だと、Fortranユーザでも直感的に解るnamelistを
Pythonでも実装することが可能です。


終わりに

今回は、PythonFortranのnamelistのように別ファイルの変数を使う方法を紹介しました。

Pythonインタープリタ言語であり、コンパイルする手間がないので
namelistのような仕組みはそれほど使われませんが、例えば

  • ソースコードをいじってほしくない、もしくは見てほしくない時
  • 複数のプログラムで同じ変数を変更して使う時
  • 大量の変数をカテゴリに分けてまとめたい時

などに使用すると便利かな、と思います。


Fotranは古の言語だと揶揄されがちですが、
概念としてはまだまだ使えるところがたくさんあるように思います。

たまには「温故知新」もやってみる価値あり、です。