1

私はファイルパーサーを書いていますが、それが返すウィッチの「データフィールド」を判別できるようにしたいと思います。

私はPythonを学び始めており、今でもJavaプログラマーのように考えることに慣れているので、この質問は、ファイルを具体的に解析する方法ではなく、モジュールを設計する方法に関するものです。

コンテキスト化すると、ファイルの各行には固定数の文字が含まれ、各情報は特定のインデックスの間に含まれます。例えば。:

XX20120101NAME1CITYA
XY20120101NAME2CITYB

この架空の例では、インデックス0から2まで、1つの情報があり、2から10まで、というように続きます。

Javaを使用して、私は通常、さまざまな情報を表す列挙子を作成し、それぞれが開始インデックス終了インデックスを「格納」します。次に、構文解析クラスで、 n個の異なる列挙型を受け入れるようにメソッドを使用可能な設計にします。例えば。:

enum FileInformation {
    INFO01(0,2), INFO02(2,10), INFO03(10,15), INFO04(15,20);
    int startIndex;
    int endIndex;

    public FileInformation(int si, int ei)  {
        this.startIndex = si;
        this.endIndex = ei;
    }

    public int getStartIndex() { return si; }
    public int getEndIndex() { return ei; }
}

public Whatever parse(FileInformation... infos) {
    // Here I would iterate through infos[], 
    // using its start and end index to retrieve only what I need.
}

私はおそらくPythonで同じ行を使用するべきではないことを知っています特に言語がそれを許可しないため(pythonには列挙型がない)、そしてpythonははるかに冗長ではないと思うので、私は良いことを知りませんこれと同じ結果を達成するための設計手法。

モジュールのユーザーを不必要な複雑さにさらしたり、各情報のインデックスをユーザーに強制したりしたくないことは言うまでもありません。モジュールのユーザーは、必要な魔女の情報とその順序を決定できることが望ましい。

それで、この必要条件をエレガントな方法で解決することについて何か洞察がありますか?前もって感謝します

4

1 に答える 1

2

Python には、FileInformation が行うことを行う組み込み型が既にあります - sliceを確認してください。

モジュールは次のようになります。

# module dataparser.py

INFO01, INFO02, INFO03, INFO04 = map(slice, ((0,2),(2,10),(10,15),(15,20)))

def parse(infos, data):
    return [data[info] for info in infos]

そして、呼び出しモジュールがそれをどのように使用するか:

# module dataparser_user.py

import dataparser as dp

data = """\
XX20120101NAME1CITYA
XY20120101NAME2CITYB""".splitlines()

for d in data:
    print d, dp.parse((dp.INFO01, dp.INFO03), d)

# or use partial to define a function object that takes your 
# subset number of slices
from functools import partial
specific_parse = partial(dp.parse, (dp.INFO01, dp.INFO03))

for d in data:
    print d, specific_parse(d)

Python で独自のenumアナログを実装する場合、最も近いものになると思いnamedtupleます (Javaenumにはゲッターがありますが、セッターがないため、namedtuples も同様に不変です)。

from collections import namedtuple
FileInformation = namedtuple("FileInformation", "start end")
INFO01, INFO02, INFO03, INFO04 = map(FileInformation, ((0,2),(2,10),(10,15),(15,20)))
于 2012-08-11T03:49:26.810 に答える