通过 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() 函数中分配 Truex 正在创建一个仅在函数内部可见的新局部变量。您需要使用 global 关键字从函数内部访问或改变全局变量 x 。另外,请注意,返回 x 的值没有任何效果,因为 control() 中的调用不使用该值。

    def quit(self):
        global x 
        x = False

虽然使用这样的全局变量通常是 anti-pattern,因此您应该考虑将 x 更改为 class 的 属性 并将其签入主循环。