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。
解决步骤
将
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修复其他代码问题(避免后续报错)
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
相关产品推荐
相关产品推荐

