3

Python を使用して、あいまい一致のために「ドント ケア」型を含む一連の型を実装しようとしています。私はそれを次のように実装しました:

class Matchable(object):        
    def __init__(self, match_type = 'DEFAULT'):
        self.match_type = match_type

    def __eq__(self, other):
        return (self.match_type == 'DONTCARE' or other.match_type == 'DONTCARE' \
or self.match_type == other.match_type)

オブジェクト指向のバックグラウンドから来ているため、このソリューションは洗練されていないようです。Matchable クラスを使用すると、醜いコードになります。私は match_type を排除し、代わりに各型をスーパークラスから継承した独自のクラスにし、型チェックを使用して比較を行いたいと考えています。ただし、型チェックは一般的に嫌われているようです。

http://www.canonical.org/~kragen/isinstance/

この機能を実装するためのより良い (より Pythonic な) 方法はありますか?

注: Python の「列挙型」に関する多数の質問と回答があることは承知しており、それらの回答のいずれかが適切である可能性があります。オーバーライドされた __ eq __ 関数の要件は問題を複雑にします。この場合に提案された enum 実装を使用する方法は見たことがありません。

これを行うために私が思い付くことができる最良のオブジェクト指向の方法は次のとおりです。

class Match(object):
    def __eq__(self, other):
        return isinstance(self, DontCare) or isinstance(other, DontCare) or type(self) == type(other)

class DontCare(Match):
    pass

class A(Match):
    pass

class B(Match):
    pass

d = DontCare()
a = A()
b = B()


print d == a
True
print a == d
True
print d == b
True
print a == b
False
print d == 1
True
print a == 1
False
4

2 に答える 2

2

あなたがリンクした記事は、それisinstanceが常に悪であるとは限らないと言っています。あなたの場合、それは適切だと思います。この記事の主な不満はisinstance、オブジェクトが特定のインターフェイスをサポートしているかどうかを確認するために を使用すると、暗黙のインターフェイスを使用する機会が減るということであり、それは正当な理由です。ただし、あなたの場合、基本的にDontcareクラスを使用して、比較でオブジェクトをどのように処理するかについて注釈を提供し、isinstanceそのような注釈をチェックしますが、これは完全である必要があります。大丈夫。

于 2013-04-02T22:45:49.550 に答える
2

オペランドのいずれかがファジー型であるかどうかを確認するだけでよいと思いますか?

class Fuzzy(object):
    def __eq__(*args):
        def isFuzzy(obj):
            return isinstance(obj, Fuzzy)
        return any(map(isFuzzy, args))

これで、次のことができます。

>>> class DefaultClass(object):
...    pass

>>> class DontCareClass(Fuzzy):
...    pass

>>> DefaultClass() == DontCareClass()
True

を使用しているのでisInstance、これはポリモーフィズムでうまく機能します。isInstance私の意見では、これは の完全に正当な使用法です。回避したいのは、ダックタイピングに頼ることができる場合の型チェックですが、これはそのようなケースの 1 つではありません。

編集:実際には、実用的な目的のために、これも完全に問題ありません:

class Fuzzy(object):
    def __eq__(*args):
        return True
于 2013-04-02T22:30:24.383 に答える