遍历时使用sorted排序并调用类的方法出现NameError

import collections
from random import choice

Card = collections.namedtuple('Card',['rank', 'suit'])


class FrenchDeck:
   ranks = [str(n) for n in range(2,11)] + list('JQKA')
   suits = 'spades diamonds clubs hearts'.split()

   def __init__(self):
      self._cards = [Card(rank, suit) for suit in self.suits
                              for rank in self.ranks]

   def __len__(self):
      return len(self._cards)

   def __getitem__(self, position):
      return self._cards[position]

   suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0)


   def spades_high(card):
      rank_value = FrenchDeck.ranks.index(card.rank)
      return rank_value * len(suit_values) + suit_values[card.suit]


deck = FrenchDeck()


for card in sorted(deck, key=spades_high): #doctest: +ElLIPSIS
   print(card)

如图所示

输出错误

Traceback (most recent call last):
  File "C:/Users/86199/Desktop/wqe.py", line 32, in <module>
    for card in sorted(deck, key=spades_high): #doctest: +ElLIPSIS
NameError: name 'spades_high' is not defined

Process finished with exit code 1

 

suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0)和spades_high应该是写到FrenchDeck外面,完全代码如下所示:

import collections

Card = collections.namedtuple('Card', ['rank', 'suit'])

class FrenchDeck:

    ranks = [str(n) for n in range(2, 11)] + list('JQKA')
    suits = 'spades diamonds clubs hearts'.split()

    def __init__(self):
        self._cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks]

    def __len__(self):
        return len(self._cards)

    def __getitem__(self, position):
        return self._cards[position]

suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0)

def spades_high(card):
    rank_value = FrenchDeck.ranks.index(card.rank)
    return rank_value * len(suit_values) + suit_values[card.suit]

deck = FrenchDeck()
for card in sorted(deck, key=spades_high): #doctest: +ElLIPSIS
    print(card)