我有几个方法的类来分配来自用户的输入,将添加,删除或更新与输入嵌套的字典属性,三种方法。我想补充一个MAIN_MENU功能,使用户可以访问的添加,删除和更新方法,然后选择要么继续添加/删除/更新字典,或返回到主菜单。
当我试图做一个MAIN_MENU功能,我收到NameError:名字“命令”是没有定义。该计划将通过预期如果MAIN_MENU不是一个函数,但一旦我试图把它变成一个功能,我得到的错误循环。我已经尝试了不同级别的缩进,但我是新来的Python和不知道什么尝试。
class MyClass:
def __init__(self):
self.x = 0
self.y = 0
self.z = 0
def get_x(self):
#code to get x from user input
def get_y(self):
#code to get y from user
def get_z(self):
#code to get z from user
def add_info(self):
store_info = {}
id = 0
while command = '1':
new_info = {}
new_id = len(store_info) + 1
store_info[new_id] = new_info
x = h.get_x()
new_info['x'] = x
y = h.get_y()
new_info['y'] = y
z = h.get_z()
new_info['z'] = z
print('Your info has been updated.\n', store_info)
choice = input('To add more info, type 1. To return to the main menu, type 2')
if choice == '1':
continue
elif choice == '2':
main_menu()
else:
print('The End')
break
def delete_info(self):
#code to delete, with an option at the end to return to main_menu
def update_info(self):
#code to update, with option for main_menu
def main_menu():
main_menu_option = """Type 1 to add.
Type 2 to delete.
Type 3 to update.
Type any other key to quit.\n"""
h = MyClass()
command = input(main_menu_option)
if command == '1':
h.add_info()
elif command == '2':
h.delete_info()
elif command == '3':
h.update_info()
else:
print('Good bye.')
main_menu()
当我运行该程序,我得到的主菜单和类型1,但随后收到命令NameError。之前,我试图让MAIN_MENU一个功能,我可以访问Add方法添加信息,以嵌套的字典。
在Python方法/函数只能访问变量在其范围或父作用域。例如:
command = 1 # A
def foo():
print(command)
def bar():
command = 2 # B
print(command)
foo()
bar()
print(command)
打印出1
然后2
然后1
。这工作,因为当我们调用foo
,蟒蛇着眼于局部变量,实现没有command
变量存在,所以它看起来在上述范围内,看到在标签A的command
变量然后当我们调用bar()
我们添加了一个变量,名为command
(标签二)bar
的局部变量,然后打印,请注意,Python没有看这里的全局变量,所以它打印2
不改变初始command
变量(标签A)我们可以看到,当我们终于print(command)
在脚本结束。
正是因为这样,你的计划失败,你add_info
方法试图访问一个名为command
但是,没有在其本地变量或全球范围存在变量。造成这种情况的解决将是通过将其作为参数传递给来自command
的方法add_info
添加到main_menu
局部变量。
# in main_menu
if command == '1':
h.add_info(command)
# in add_info
def add_info(self, command):
...