パイピングで機能を整理するにはどうすればよいですか?
-
18-09-2019 - |
質問
私はPythonとファイルを解析しています パイピング (これはレポートファイルです psat Matlabでは重要ではありません)。 ここ 私がこれまでに持っているものです。それは混乱だと思いますし、それを改善する方法についてのアドバイスが欲しいと思います。具体的には、文法の定義をパイピングで整理するにはどうすればよいですか?
すべての文法定義を1つの関数に配置する必要がありますか?もしそうなら、それは1つの大きな機能になるでしょう。そうでない場合は、どうすれば分割しますか。現時点では、ファイルのセクションに分割しました。 1つの場所から一度だけ呼ばれる機能をたくさん作る価値がありますか?どちらも私には本当に正しいとは感じていません。
すべての入力コードと出力コードを別のファイルに他のクラス関数に配置する必要がありますか?それはクラスの目的をより明確にするでしょう。
また、ファイルを解析し、正気のチェックを行い、クラスにデータを保存する簡単な方法があるかどうかを知りたいと思います。私はこれをするのに多くの時間を費やしているようです。
(私はの答えを受け入れます それは十分です また PyparingではなくXを使用します 人々が同意した場合)
解決
私はどちらの方法でも、単一の大きな方法を使用して、パーサーを作成して、今のようにステップで取ることができます。
スリット(「リテラルを抑制する」、私が推測する)、StringTolits、Deicimaltableなどのいくつかの有用なヘルパーユーティリティを定義していることがわかります。これは私には良さそうです。
私はあなたが結果名を使用しているのが好きで、彼らはあなたのポストパージングコードの堅牢性を本当に改善します。 1.4.7のパイピングに追加されたショートカットフォームを使用することをお勧めします。
busname.setResultsName("bus1")
と
busname("bus1")
これにより、コードがかなり整理される可能性があります。
個々のトークンにアクセスするために数値インデックスを使用している場所を確認するために、あなたの解析アクションを振り返り、代わりに戻って結果名を割り当てます。 GetStatsが戻ってくる1つのケースがあります (ngroup + sgroup).setParseAction(self.process_stats)
. 。 process_statsには次のような参照があります。
self.num_load = tokens[0]["loads"]
self.num_generator = tokens[0]["generators"]
self.num_transformer = tokens[0]["transformers"]
self.num_line = tokens[0]["lines"]
self.num_bus = tokens[0]["buses"]
self.power_rate = tokens[1]["rate"]
私はあなたが値と統計をグループ化したことが好きですが、先に進んで、「ネットワーク」や「soln」などの名前を付けます。次に、この解析のアクションコードを書くことができます(私にも私に変換しました - DICT要素表記の代わりに読みやすいオブジェクトアトリブ表記です):
self.num_load = tokens.network.loads
self.num_generator = tokens.network.generators
self.num_transformer = tokens.network.transformers
self.num_line = tokens.network.lines
self.num_bus = tokens.network.buses
self.power_rate = tokens.soln.rate
また、スタイルの質問:「+」オペレーターを使用する代わりに、なぜ明示的およびコンストラクタを使用するのですか?
busdef = And([busname.setResultsName("bus1"),
busname.setResultsName("bus2"),
integer.setResultsName("linenum"),
decimaltable("pf qf pl ql".split())])
これは同じくらい簡単に書かれています:
busdef = (busname("bus1") + busname("bus2") +
integer("linenum") +
decimaltable("pf qf pl ql".split()))
全体として、これはこの複雑さのファイルのパーについてだと思います。私はあなたが持っている方法と同様のコードを断片にしたが、1つの大きな方法で、次のようなものでコードを構築した同様の形式(独自の独自)を持っています。
def parser():
header = Group(...)
inputsummary = Group(...)
jobstats = Group(...)
measurements = Group(...)
return header("hdr") + inputsummary("inputs") + jobstats("stats") + measurements("meas")
グループコンストラクトは、このような大きなパーサーで特に役立ち、解析されたデータの各セクション内の結果名の一種の名前空間を確立します。