运行程序将导致错误消息:
TypeError: unsupported operand type(s) for +=: 'int' and 'NoneType'
问题在于行value += values.get(card.get_rank)
我认为get_rank
方法可能存在问题?它不返回整数吗?
ranks = ('A','2','3','4','5','6','7','8','9','10','J','Q','K')
values = {'A':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,'10':10,'J':10,'Q':10,'K':10}
suits = ('Diamonds','Hearts','Clubs','Diamonds')
class Card:
def __init__(self, suit, rank):
self.suit = suit
self.rank = rank
def __str__(self, suit, rank):
print (self.rank + 'of' + self.rank)
def get_rank(self):
return self.rank
class Hand:
def __init__(self):
self.hand = []
def __str__(self):
hand = ''
for card in self.hand:
hand = hand + str(card)
return hand
def get_value(self):
value = 0
aces = 0
for card in self.hand:
if card.get_rank == 'A':
aces += 1
value += values.get(card.get_rank)
if (aces>0) and (value + 10 <= 21):
value += 10
return value
答案 0 :(得分:1)
values.get(card.get_rank)
尝试使用实例方法作为字典的键。这不是字典中的有效密钥,因此dict.get()
会返回默认的None
。
相反,您希望调用方法,并使用return
值作为键:
value += values.get(card.get_rank())
或者,由于普通的getter和setter是unpythonic,只需直接访问该属性:
value += values.get(card.rank)
请注意,您也可以将默认值传递给dict.get()
,以确保始终获得合理的返回值:
value += values.get(card.rank, 0)
现在,如果values
中的卡等级没有值,则假定其值为零。
此外,还不清楚values
的来源。我建议你把它作为类属性:
class Hand:
VALUES = {...}
...
def get_value(self):
...
value += self.VALUES.get(card.rank, 0)
...
或get_value
的明确论据:
class Hand:
...
def get_value(self, values):
...
value += self.values.get(card.rank, 0)
...