1

我目前正在编写的一段代码遇到了一些问题。

使用以下代码,我得到 NameError: global name 'doc' is not defined。

def createHtml():
    name = input("\nEnter the name for your HTML-page: ")   
    doc = open(name + ".html", 'w')

def createTitle():
    print (t[0], file=doc) #<!DOCTYPE html>
    print (t[1], file=doc) #<html>
    print (t[2], file=doc) #<head>
    title = input("Enter your title here: ")
    print ("  <title>",title,"</title>", file=doc)
    print (t[3], file=doc) #</head>

我知道这是因为文档仅在 createHtml 函数中定义。但是,如果我想让同一个文档在不同的函数中调用时工作,我该如何让它工作呢?我不能将它排除在 createHtml 函数之外,因为它会弄乱我的程序,因为我有一个允许用户从不同功能中进行选择的菜单。像这样:

while True:
    menu = input("\nPress 1 to enter the file name for the HTML-page"
                 "\nPress 2 to enter title for the HTML-page"
                 "\nPress 3 to start entering code in body"
                 "\nPress 4 to exit\n")
    if menu == "1":
        createHtml()
    elif menu == "2":
        createTitle()
    elif menu == "3":
        createBody()
    else:
        print ("Good bye!")
        break
doc.close()

该文档由以下名称变量定义:

name = input("\nEnter the name for your HTML-page: ")

反正有没有从 createHtml 函数获取文档到我的其他函数?

4

2 回答 2

2

将函数包装在一个类中怎么样?

class HtmlBuilder(object):

    def __init__(self):
        self.doc = None

    def createHtml(self):
        name = input("\nEnter the name for your HTML-page: ")   
        self.doc = open(name + ".html", 'w')

    def createTitle(self):
        print (t[0], file=self.doc) #<!DOCTYPE html>
        print (t[1], file=self.doc) #<html>
        print (t[2], file=self.doc) #<head>
        title = input("Enter your title here: ")
        print ("  <title>",title,"</title>", file=doc)
        print (t[3], file=self.doc) #</head>

    def Dispose(self):
        self.doc.flush()
        self.doc.close()

就像这样使用它:

hb = HtmlBuilder()
while True:
    menu = input("\nPress 1 to enter the file name for the HTML-page"
                 "\nPress 2 to enter title for the HTML-page"
                 "\nPress 3 to start entering code in body"
                 "\nPress 4 to exit\n")
    if menu == "1":
        hb.createHtml()
    elif menu == "2":
        hb.createTitle()
    elif menu == "3":
        hb.createBody()
    else:
        print ("Good bye!")
        break

hb.Dispose()

归根结底,这是面向对象编程的完美用例,不是吗?在此之后,可以做很多好的改进。

例如:

  1. print将函数中的语句替换为外部代码。
  2. 使您的方法可测试。
  3. 单元测试。
  4. 好东西:D
于 2013-11-07T14:14:44.290 回答
1

您的函数createHtml()函数将需要return doc,然后您可以将其传递给createTitle(). 像这样的东西:

def createHtml():
    name = input("\nEnter the name for your HTML-page: ")   
    doc = open(name + ".html", 'w')
    return doc

那么在你的while循环中:

doc = createHtml()

然后你可以将它传递给其他函数:

createTitle(doc)

请注意,不必在每个函数中调用相同的东西。

于 2013-11-07T14:13:43.680 回答