ほとんどの場合isinstance
、必要ないか、避けるべきであることを認識しています (例: Is this use of isinstance pythonic/"good"? )。しかし、時々それは私が必要とするものです。
ただし、Python 2.6、2.7、および 3.2 の両方で isinstance
、doctest での実行と通常の実行の間で次のような不規則性があることに気付きました。
たとえば、次の動作が予想されます。ここで、isinstance
は、修飾名を使用しているか非修飾名を使用しているかに関係ありません。
import collections
from collections import OrderedDict
assert isinstance(collections.OrderedDict(), collections.OrderedDict) == True
assert isinstance(collections.OrderedDict(), OrderedDict) == True
Doctest 内で実行される同じコードは、まったく同じように機能します。
ただし、「isinstanceTest.py」という名前のモジュール内にクラスを定義し、isinstance
そのクラスに一致するために使用する関数を同じモジュール内に定義すると、事態はさらに興味深いものになります。次の doctest は合格するように書かれています。私は定期的に を使用してunittest.TextTestRunner
、1 つのスイートで多くのモジュールにわたって doctest と unittest を収集して実行しています。
import unittest, doctest
import collections
class A: pass
def isinstance_A(arg):
'''
>>> import isinstanceTest
>>> isinstanceTest.isinstance_A(isinstanceTest.A())
True
>>> isinstance_A(A())
True
>>> isinstanceTest.isinstance_A(A())
False
>>> isinstance_A(isinstanceTest.A())
False
'''
return isinstance(arg, A)
if __name__ == '__main__':
l = doctest.DocTestSuite(__name__)
runner = unittest.TextTestRunner()
runner.run(l)
修飾名と非修飾名の両方が使用されている最後の 2 つの doctest ステートメントでは、予期しない結果が生じることに注意してください。
「isinstanceTest.py」が存在するディレクトリにいるときに、インタープリターを開いて同等のコマンドを実行すると、結果は期待どおりになります。
Python 3.2.3 (default, May 3 2012, 15:51:42)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import isinstanceTest
>>> from isinstanceTest import *
>>> isinstanceTest.isinstance_A(isinstanceTest.A())
True
>>> isinstance_A(A())
True
>>> isinstanceTest.isinstance_A(A())
True
>>> isinstance_A(isinstanceTest.A())
True
したがって、この動作はテスト スイートでの doctest の実行に一貫性があり、ローカライズされています (そして、必要に応じてコーディングを行っており、通常はとにかく doctest で修飾名のみを使用しています)、より大きな問題は次のとおりです。これについて言及しているドキュメントはまだ見つかりません)、またはこれはバグですか?