1

XML ファイルに対して多くの主要な作業を行う Python 関数があります。

この関数を使用する場合、2 つのオプションが必要です。XML ファイルの名前を渡すか、事前に解析された ElementTree インスタンスを渡します。

関数がその変数で与えられたものを判断できるようにしたいと思います。

例:

def doLotsOfXmlStuff(xmlData):
    if (xmlData != # if xmlData is not ET instance):
        xmlData = ET.parse(xmlData)
    # do a bunch of stuff
    return stuff

この関数を呼び出すアプリは、一度だけ呼び出す必要がある場合もあれば、複数回呼び出す必要がある場合もあります。何度か呼び出して毎回 XML を解析するのは、非常に非効率的で不必要です。この 1 つの関数をラップするためだけにクラス全体を作成するのは少しやり過ぎに思え、最終的にコードのリファクタリングが必要になります。例えば:

ourResults = doLotsOfXmlStuff(myObject)

なる必要があります:

xmlObject = XMLProcessingObjectThatHasOneFunction("data.xml")
ourResult = xmlObject.doLotsOfXmlStuff()

また、これを多数の小さなファイルで実行する必要がある場合、そのたびにクラスが作成されるため、効率が悪いようです。

入ってくる変数の型を簡単に検出する簡単な方法はありますか? 多くのPythonerが「チェックする必要はない」と言うのは知っていますが、チェックする良い例が1つあります。

他の強い型付けの言語では、メソッドのオーバーロードでこれを行うことができますが、それは明らかに Pythonic の方法ではありません...

4

5 に答える 5

2

これはごく普通のパターンです (例:ファイル オブジェクトまたはパスを受け入れる Python 関数)。使用するだけisinstanceです:

def doLotsOfXmlStuff(xmlData):
    if not isinstance(xmlData, ET):
        xmlData = ET.parse(xmlData)
    ...

クリーンアップ (ファイルを閉じるなど) が必要な場合は、関数を再帰的に呼び出しても問題ありません。

def doLotsOfXmlStuff(xmlData):
    if not isinstance(xmlData, ET):
        xmlData = ET.parse(xmlData)
        ret = doLotsOfXmlStuff(xmlData)
        ... # cleanup (or use a context manager)
        return ret
    ...
于 2013-05-09T17:05:01.303 に答える
2

「ダックタイピング」の原則は、オブジェクトの特定のタイプを気にする必要はなく、関心のある API がサポートされているかどうかを確認する必要があるということです。

つまり、xmlData 引数を介して関数に渡されたオブジェクトに、解析された ElementTree を示すメソッドまたは属性が含まれている場合は、それらのメソッドまたは属性を使用するだけです...必要な属性がない場合は、その後、自由に解析して渡すことができます。

結果ETの関数/メソッド/属性を使用したいですか?hasattr()それを確認するために使用できます。try: ... except AttributeError:または、そのような機能への呼び出しをブロックでラップすることもできます。

if not hasattr(...):個人的にはもう少しきれいだと思います。(必要な属性がない場合は、必要に応じて、準備、解析されたものに名前を再バインドします)。

isinstance()このアプローチには、機能のユーザーが、継承ではなく構成によって ET を拡張した独自のクラス内のオブジェクトへの参照を渡すことができるため、利点があります。つまり、ET のようなオブジェクトを独自のクラスでラップし、必要な機能を公開すると、参照を関数に渡すことができ、オブジェクトが「アヒル」であるかのように扱われるようになります。アヒルの子孫ではありませんでした。羽、くちばし、水かきのある足が必要な場合は、そのうちの 1 つを確認して、残りを使用してみてください。私はアヒルが入った黒い箱かもしれませんし、足、カモノハシ、羽にアクセスできる穴を設けたかもしれません。

于 2013-05-09T17:07:29.397 に答える
0

isinstance を使用して、変数の型を判別できます。

于 2013-05-09T17:04:54.373 に答える
0

if ステートメントを入れて型をチェックし、そこから実行するものを決定してみてください。

if type(xmlData).__name__=='ElementTree':
    #do stuff
else: 
    #do some other stuff
于 2013-05-09T17:05:12.283 に答える
0

データ型を比較できると思います:

if (xmlData.dtype==something):
    call Function1
else:
    call Function2
于 2013-05-09T17:06:30.997 に答える