2

我正在研究 python 中缀运算符,我发现了这个:Python:定义我自己的运算符?

很久以前有人问过,但我找不到更新的东西。这似乎比我通常习惯做的更像是一种黑客行为。使用那个 hack,我改变了我的代码:

if __name__ == '__main__':
    of = Infix(lambda x, y: Card(Value[x], Suit[y]))

    card1 = 'EIGHT' | of | 'DIAMONDS'
    card2 = 'THREE' | of | 'SPADES'
    card3 = 'QUEEN' | of | 'SPADES'

    assert card1.suit != card2.suit
    assert card3.suit == card2.suit

    assert ('NINE' | of | 'HEARTS').beats('EIGHT' | of | 'HEARTS')
    assert ('NINE' | of | 'HEARTS').beats('EIGHT' | of | 'HEARTS', trump=Suit.HEARTS)
    assert ('NINE' | of | 'HEARTS').beats('EIGHT' | of | 'HEARTS', trump=Suit.DIAMONDS)

    assert not Card(Value.NINE, Suit.HEARTS).beats(Card(Value.TEN, Suit.HEARTS))
    assert not Card(Value.NINE, Suit.HEARTS).beats(Card(Value.TEN, Suit.HEARTS), trump=Suit.HEARTS)
    assert not Card(Value.NINE, Suit.HEARTS).beats(Card(Value.TEN, Suit.HEARTS), trump=Suit.DIAMONDS)

    assert not Card(Value.NINE, Suit.DIAMONDS).beats(Card(Value.EIGHT, Suit.HEARTS))
    assert not Card(Value.NINE, Suit.DIAMONDS).beats(Card(Value.EIGHT, Suit.HEARTS), Suit.HEARTS)
    assert not Card(Value.NINE, Suit.DIAMONDS).beats(Card(Value.EIGHT, Suit.HEARTS), Suit.CLUBS)

您可以看到有无代码的样子,我认为这样更具可读性。尽管如此,它还是一个 hack,而且我也不喜欢通过字符串访问枚举。我还在考虑:

EIGHT = Value.EIGHT
SPADES = Suit.SPADES

card = Card(EIGHT, SPADES)

我什至可以结合这两种方法并将中缀更改为:

   of = Infix(lambda x,y: Card(x, y))

   card = EIGHT | of | SPADES

有没有更好的方法在 Python 3 中做中缀的事情?值得做吗?

编辑:

    assert not (NINE | of | HEARTS).beats(TEN | of | HEARTS)
    assert not (NINE | of | HEARTS).beats(TEN | of | HEARTS, trump=HEARTS)
    assert not (NINE | of | HEARTS).beats(TEN | of | HEARTS, trump=DIAMONDS)

    assert not Card(NINE, DIAMONDS).beats(Card(EIGHT, HEARTS))
    assert not Card(NINE, DIAMONDS).beats(Card(EIGHT, HEARTS), trump=HEARTS)
    assert not Card(NINE, DIAMONDS).beats(Card(EIGHT, HEARTS), trump=CLUBS)

一个评论可能暗示第一个区块并不比第二个好。我可以看到那里的逻辑。这包括我认为好的整个EIGHT = Value.EIGHT事情。(你能告诉我我来自编译语言吗?)

4

1 回答 1

0

只需让类通过工厂方法进行解析:

class Card:
    # other stuff
    @staticmethod
    def fromstring(s):
        value, of, suit = s.split()
        return Card(Value[value], Suit[suit])
于 2019-12-25T20:39:00.310 回答