我正在研究 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
事情。(你能告诉我我来自编译语言吗?)