You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python调用make_flights()出现NameError错误的技术求助

解决Python中make_flights()的NameError问题

我是Python新手,正在通过Pluralsight学习Python。当尝试调用make_flights()时出现错误,报错信息如下:

Traceback (most recent call last):
  File "C:\python_work\Airtravel.py", line 169, in <module>
    c,d = make_flights()
NameError: name 'make_flights' is not defined
[Finished in 125ms]

我的代码如下:

from pprint import pprint as pp
#Model for aircraft flights.

class Flight:

    def __init__(self, number, aircraft):
        #flight number should be like"SN060"
        if not number[:2].isalpha():
            raise ValueError(f"No airline code in  '{number}'")

        if not number[:2].isupper():
            raise ValueError(f"Invalid Airline code '{number}'")

        if not (number[2:].isdigit() and int(number[2:]) <= 9999):
            raise ValueError(f"Invalid route number'{number}'")
        self._number = number
        self._aircraft = aircraft

        rows, seats = self._aircraft.seating_plan()
        self._seating=[None] + [{letter : None for letter in seats} for _ in rows]

    def number(self):
        return self._number

    def aircraft_model(self):
        return self._aircraft.model()

    def allocate_seat(self, seat, passenger):
        # Allocate seat to passengers
        # seat : '12C' or '20A'
        #passenger : name of passenger

        row, letter = self._parse_seat(seat)

        if self._seating[row][letter] is not None:
            raise ValueError(f"seat{seat} already Occupied")

        self._seating[row][letter] = passenger

    def _parse_seat(self, seat):
        row, seat_letters = self._aircraft.seating_plan()   

        letter = seat [-1]
        if letter not in seat_letters:
            raise ValueError(f"Invalid seat letter {letter}")

        row_text= seat[:-1]
        try: 
            row=int(row_text)
        except ValueError:
            raise ValueError(f"invalid seat row {row_text}")

        if row not in rows:
            raise ValueError(f"Invalid row number{row}")

        return row, letter

    def relocate_passenger(self, from_seat, to_seat):
        #Reloacte passenger to new seat.

        from_row, from_letter = self._parse_seat(from_seat)
        if self._seating[from_row][from_letter] is None:
            raise ValueError(f'No passenger to relocate in seat {from_seat}')

        to_row, to_letter = self._parse_seat(to_seat)
        if self._seating[to_row][to_letter] is None:
            raise ValueError(f'seat{to_seat} already Occupied')

        self._seating[to_row][to_letter] = self._seating[from_row][from_letter]
        self._seating[from_row][from_letter] = None

    def num_available_seats(self):
        return sum(
            sum(1 for s in row.values() if s in None)
            for row in self._seating
            if row is not None
            )

    def make_boarding_cards(self, card_printer):
        for passenger, seat in sorted(self._passenger_seat()):
            card_printer(passenger, seat, self.number(), self.aircraft_model())

    def _passenger_seats(self):
        # Passenger seating allocation
        row_numbers, seat_letters = self._aircraft.seating_plan()
        for row in row_numbers:
            for letter in seat_letters:
                passenger = self._seating[row][letter]
                if passenger is not None:
                    yield (passenger, f"{row}{letter}")


    def make_flights(self):
        f = Flight("BA758", AirbusA319("G-EUPT"))
        f.allocate_seat('12A', 'Blake McNeal')
        f.allocate_seat('15F', 'Tiffany Croom')
        f.allocate_seat('15E', 'Mike Jude')
        f.allocate_seat('1C', 'Micky Mouse')
        f.allocate_seat('1D', 'Joe May')

        g = Flight("AF72", Boeing777("F-GSPS"))
        g.allocate_seat('55K', 'Larry Wall')
        g.allocate_seat('33G', 'Yukihiro Matsumoto')
        g.allocate_seat('4B', 'Brian Kernighan')
        g.allocate_seat('4A', 'Dennis Ritchie')

        return f, g

    def card_printer(passenger, flight_number, aircraft):
        output = (
            f"| Name: {passenger}"      \
            f"  Flight: {flight_number}"\
            f"  Seat: {seat}"           \
            f"  Aircraft: {aircraft}"   \
            f"|"
        )
        banner = "+" + "-" * (len(output) - 2) + '+'
        border = '|' + ' ' * (len(output) - 2) + '|'
        lines = [banner, border, output, border, banner]
        card = "\n".join(lines)
        print(card)
        print()

class Aircraft:

    def __init__(self, registration):
        #Simulate Aircraft attributes.
        self._registration = registration
        

    def registration(self):
        return self._registration

    def num_seats(self):
        rows, row_seats = self.seating_plan()
        return len(rows) * len(row_seats)

class AirbusA319(Aircraft):

    def model(self):
        return "Airbus A319"

    def seating_plan(self):
        return range(1,23), "ABCDEFGHJK"

class Boeing777(Aircraft):

    def model(self):
        return "Boeing 777"

    def seating_plan(self):
        return range(1, 56), "ABCDEFGHJK"

问题原因

你把make_flights()定义成了Flight类的实例方法,但调用时是在全局作用域直接调用,Python找不到这个全局函数,所以抛出NameError。

解决步骤

  1. 将make_flights改为全局函数
    把make_flights方法从Flight类中移出,放到所有类定义的外面(比如文件末尾),这样它就成为全局可调用的函数:

    def make_flights():
        f = Flight("BA758", AirbusA319("G-EUPT"))
        f.allocate_seat('12A', 'Blake McNeal')
        f.allocate_seat('15F', 'Tiffany Croom')
        f.allocate_seat('15E', 'Mike Jude')
        f.allocate_seat('1C', 'Micky Mouse')
        f.allocate_seat('1D', 'Joe May')
    
        g = Flight("AF72", Boeing777("F-GSPS"))
        g.allocate_seat('55K', 'Larry Wall')
        g.allocate_seat('33G', 'Yukihiro Matsumoto')
        g.allocate_seat('4B', 'Brian Kernighan')
        g.allocate_seat('4A', 'Dennis Ritchie')
    
        return f, g
    
  2. 修复其他代码问题(避免后续报错)

    • num_available_seats方法中,判断空座位的s in None要改成s is None(判断None必须用is):
      def num_available_seats(self):
          return sum(
              sum(1 for s in row.values() if s is None)
              for row in self._seating
              if row is not None
          )
      
    • make_boarding_cards方法中,调用的self._passenger_seat()要改成self._passenger_seats()(方法名拼写错误):
      def make_boarding_cards(self, card_printer):
          for passenger, seat in sorted(self._passenger_seats()):
              card_printer(passenger, seat, self.number(), self.aircraft_model())
      
    • card_printer同样要移出Flight类改为全局函数,并且修正参数缺失问题(原方法少了seat参数):
      def card_printer(passenger, seat, flight_number, aircraft):
          output = (
              f"| Name: {passenger}"      \
              f"  Flight: {flight_number}"\
              f"  Seat: {seat}"           \
              f"  Aircraft: {aircraft}"   \
              f"|"
          )
          banner = "+" + "-" * (len(output) - 2) + '+'
          border = '|' + ' ' * (len(output) - 2) + '|'
          lines = [banner, border, output, border, banner]
          card = "\n".join(lines)
          print(card)
          print()
      

做完以上修改后,再调用c,d = make_flights()就不会报错了,同时也能避免后续运行中出现其他问题。


内容的提问来源于stack exchange,提问作者Adeem Shahzad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 21:36:22