1

現在書いているコードに問題があります。

次のコードでは、NameError: グローバル名 'doc' が定義されていません。

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-function から除外することはできません。このような:

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()

そして、doc は name 変数によって次のように定義されます。

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

createHtml-function から他の関数​​にドキュメントを取得する方法はありますか?

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()function は に渡す必要があり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 に答える