通过 class 方法退出 while 循环
Quiting while loop through class method
from dataclasses import dataclass, field
from employee import Employee
import json
import re
# from custom_exception import Input_Exception
@dataclass()
class ResourceManager:
employee_list: dict = field(default_factory=dict)
def menu(self):
print('Menu:')
print('1 : Show data about employee')
print('2 : Add new employee')
print('3 : Remove employee')
print('4 : Add or remove employee hours')
print('5 : Save changes into the file')
print('6 : Load data from the file')
print('7 : Check employee salary')
print('0 : Exit program')
def controls(self):
switch = {
"1": self.search_employee,
"2": self.add_employee,
"3": self.remove_employee,
"4": self.change_hours,
"5": self.save_data,
"6": self.load_data,
"7": self.check_salary,
"x": self.quit,
}
choice = input("Wybierz jedną opcję:\n=> ")
if choice in switch.keys():
switch[choice]()
else:
print("Niepoprawny wybór!")
def quit(self):
x = False
return x
ResourceManage是一个class用来表示相当简单的CLI,我用字典实现switch,想用def quit(self)退出程序。
from resource_manager import ResourceManager
if __name__ == '__main__':
setup = ResourceManager()
x = True
while x:
setup.menu()
setup.controls()
CLI 菜单,我在其中尝试使用 def quit(self) 方法通过更改全局 x 退出 while 循环,但它不起作用。我已经尝试了很多不同的东西,但无法让它工作。
我该如何解决?
在你的代码中有两个x。一个 x 在局部函数 quit 中,另一个在全局范围内。分配一个不会改变另一个。
我建议您向 ResourceManager 添加一个属性,说明 cli 是否应该退出。
这可以这样工作:
from dataclasses import dataclass, field
from employee import Employee
import json
import re
# from custom_exception import Input_Exception
@dataclass()
class ResourceManager:
employee_list: dict = field(default_factory=dict)
x: bool = True
def menu(self):
print('Menu:')
print('1 : Show data about employee')
print('2 : Add new employee')
print('3 : Remove employee')
print('4 : Add or remove employee hours')
print('5 : Save changes into the file')
print('6 : Load data from the file')
print('7 : Check employee salary')
print('0 : Exit program')
def controls(self):
switch = {
"1": self.search_employee,
"2": self.add_employee,
"3": self.remove_employee,
"4": self.change_hours,
"5": self.save_data,
"6": self.load_data,
"7": self.check_salary,
"x": self.quit,
}
choice = input("Wybierz jedną opcję:\n=> ")
if choice in switch.keys():
switch[choice]()
else:
print("Niepoprawny wybór!")
def quit(self):
self.x = False
return self.x
主体现在可以引用以下属性:
if __name__ == '__main__':
setup = ResourceManager()
while setup.x:
setup.menu()
setup.controls()
希望我能帮到你?
在您的 quit()
函数中分配 True
的 x
正在创建一个仅在函数内部可见的新局部变量。您需要使用 global
关键字从函数内部访问或改变全局变量 x
。另外,请注意,返回 x
的值没有任何效果,因为 control()
中的调用不使用该值。
def quit(self):
global x
x = False
虽然使用这样的全局变量通常是 anti-pattern,因此您应该考虑将 x
更改为 class 的 属性 并将其签入主循环。
from dataclasses import dataclass, field
from employee import Employee
import json
import re
# from custom_exception import Input_Exception
@dataclass()
class ResourceManager:
employee_list: dict = field(default_factory=dict)
def menu(self):
print('Menu:')
print('1 : Show data about employee')
print('2 : Add new employee')
print('3 : Remove employee')
print('4 : Add or remove employee hours')
print('5 : Save changes into the file')
print('6 : Load data from the file')
print('7 : Check employee salary')
print('0 : Exit program')
def controls(self):
switch = {
"1": self.search_employee,
"2": self.add_employee,
"3": self.remove_employee,
"4": self.change_hours,
"5": self.save_data,
"6": self.load_data,
"7": self.check_salary,
"x": self.quit,
}
choice = input("Wybierz jedną opcję:\n=> ")
if choice in switch.keys():
switch[choice]()
else:
print("Niepoprawny wybór!")
def quit(self):
x = False
return x
ResourceManage是一个class用来表示相当简单的CLI,我用字典实现switch,想用def quit(self)退出程序。
from resource_manager import ResourceManager
if __name__ == '__main__':
setup = ResourceManager()
x = True
while x:
setup.menu()
setup.controls()
CLI 菜单,我在其中尝试使用 def quit(self) 方法通过更改全局 x 退出 while 循环,但它不起作用。我已经尝试了很多不同的东西,但无法让它工作。
我该如何解决?
在你的代码中有两个x。一个 x 在局部函数 quit 中,另一个在全局范围内。分配一个不会改变另一个。
我建议您向 ResourceManager 添加一个属性,说明 cli 是否应该退出。
这可以这样工作:
from dataclasses import dataclass, field
from employee import Employee
import json
import re
# from custom_exception import Input_Exception
@dataclass()
class ResourceManager:
employee_list: dict = field(default_factory=dict)
x: bool = True
def menu(self):
print('Menu:')
print('1 : Show data about employee')
print('2 : Add new employee')
print('3 : Remove employee')
print('4 : Add or remove employee hours')
print('5 : Save changes into the file')
print('6 : Load data from the file')
print('7 : Check employee salary')
print('0 : Exit program')
def controls(self):
switch = {
"1": self.search_employee,
"2": self.add_employee,
"3": self.remove_employee,
"4": self.change_hours,
"5": self.save_data,
"6": self.load_data,
"7": self.check_salary,
"x": self.quit,
}
choice = input("Wybierz jedną opcję:\n=> ")
if choice in switch.keys():
switch[choice]()
else:
print("Niepoprawny wybór!")
def quit(self):
self.x = False
return self.x
主体现在可以引用以下属性:
if __name__ == '__main__':
setup = ResourceManager()
while setup.x:
setup.menu()
setup.controls()
希望我能帮到你?
在您的 quit()
函数中分配 True
的 x
正在创建一个仅在函数内部可见的新局部变量。您需要使用 global
关键字从函数内部访问或改变全局变量 x
。另外,请注意,返回 x
的值没有任何效果,因为 control()
中的调用不使用该值。
def quit(self):
global x
x = False
虽然使用这样的全局变量通常是 anti-pattern,因此您应该考虑将 x
更改为 class 的 属性 并将其签入主循环。