Python变量将函数传递给菜单

时间:2014-11-03 20:43:22

标签: python

我有一个功能,menu(),它创建一个菜单来导航和调用功能。这是功能。

def menu():
    x = raw_input("WOOF! What can POODLE fetch for you? ('--nothing' to exit): ")
    if x == "--nothing":
            sys.exit(0)
    elif x == "--build":
            populateCrawled(toCrawl)
            graph = buildGraph(crawled)
            index = buildIndex(graph)
            ranks = computeRanks(graph)
            menu()
    elif x == "--dump":
            saveFile(index, "index.txt")
            saveFile(graph, "graph.txt")
            saveFile(ranks, "ranks.txt")
            menu()
    elif x == "--restore":
            index = loadFile("index.txt")
            graph = loadFile("graph.txt")
            ranks = loadFile("ranks.txt")
            menu()
    elif x == "--print":
            print graph
            print index
            print ranks
            menu()
    elif x == "--help":
            print "WOOF! POODLE Help Options"
            print "--build     Create the POODLE database"
            print "--dump      Save the POODLE database"
            print "--restore   Retrieve the POODLE database"
            print "--print     Show the POODLE database"
            print "--help      Show this help information"
            menu()
    elif x == "--search":
            search(index, rankablePages)
    else:
            print "Help option not found"
            menu()

seed = raw_input("Please enter the seed URL: ")
testSeed = "https://dunluce.infc.ulst.ac.uk/d11ga2/COM506/AssignmentB/test_index.html"
seed = testSeed
toCrawl=[seed]
crawled, graph, index, rankablePages = [], {}, {}, {}
MAX_DEPTH = 10
menu()

这些变量和词典都是全局声明的,但是当我说“--build”类型时它确实成功构建但是如果我去输入“--print”它会显示我 UnboundLocalError:赋值前引用的局部变量“graph”

然而,如果我在建造后立即打印这些词典,那么它们打印得很好。当重新加载menu()时,它会丢失这些值。我应该使用while循环还是需要做一些参数传递?

2 个答案:

答案 0 :(得分:1)

这些变量在全球范围内宣布这一事实并没有帮助(尽管请注意,并没有实际上全局定义ranks ...),因为他们'在本地声明了 ,本地名称隐藏了全局名称。

每当你在函数体中编写spam = eggs时,会使spam成为局部变量,并且函数中出现spam的任何地方,它就会引用该局部变量。< / p>

如果您想创建一些全局内容,但仍然可以分配给它,则需要global statement。所以:

def menu():
    global graph, index, ranks
    # the rest of your code

但与往常一样,更好的解决方案是停止使用全局变量。

一个选项创建一个来保存你的状态,使menu成为该类的方法,并使类graph和朋友属性成为类的实例

但这里有一个更简单的选择。您需要这些变量是全局的唯一原因是因为menu递归地调用自身来模拟循环。由于其他原因,这在Python中已经很糟糕了。 (例如,如果你通过菜单大约999次,你将会得到一个递归错误。)如果你只是使用一个循环而不是试图伪造它,你可以只使用局部变量:

def menu(graph, index, ranks):
    while True:
        # the rest of your code except the menu() calls

# ...
crawled, graph, index, rankablePages = [], {}, {}, {}
menu(graph, index, ranks)

答案 1 :(得分:0)

您应该将图形(以及菜单应该在外部使用的任何其他变量)声明为全局:

def menu():
    global graph

    #rest of the code

您可以阅读有关全局here

的更多信息