0

関数が終了した後、変数「variable_for_raw_data」にアクセスできないのはなぜだろうと思っていました。コードは次のようになります。

def htmlfrom(Website_URL):
    import urllib.request
    response = urllib.request.urlopen(Website_URL)
    variable_for_raw_data =(input("What will this data be saved as: "))
    global variable_for_raw_data
    variable_for_raw_data = response.read()

関数が終了した後、変数「variable_for_raw_data」にアクセスできないのはなぜですか?

注意事項:

Python 3.3 urllib は urllib2 ではありません

4

1 に答える 1

1

変数を動的に作成しようとしているようです。コードは次のようになると思います。

def htmlfrom(website_url):
    import urllib.request
    response = urllib.request.urlopen(website_url)
    variable_for_raw_data =(input("What will this data be saved as: "))
    global variable_for_raw_data
    variable_for_raw_data = response.read()


if __name__ == "__main__":

    htmlfrom("www.stackoverflow.com")

    #html_stackoverflow is never created it is the value
    #of variable_for_raw_data before variable_for_raw_data
    #is overridden by response.read()

    #entering information into input doesn't create a variable
    print(html_stackoverflow)

これが私がそれを行う方法です:

import urllib.request

def htmlfrom(website_url): 
    '''
       docstrings
    '''

    response = urllib.request.urlopen(website_url)
    variable_for_raw_data = response.read()
    return variable_for_raw_data

if __name__ == "__main__":

    file_name = input("What will this data be saved as: ")
    html_from_website = htmlfrom("www.stackoverflow.com")

        with open(file_name, 'w') as f: 
        f.write(html_from_website)

説明

関数内に import ステートメントがある場合、関数内でのみアクセスできます (つまり、他の関数はアクセスできません)。

import urllib.request

PEP 8には、python で物事を命名する方法に関するガイドラインがあります。キャメルケースは通常、クラス名用に予約されています。

def htmlfrom(website_url): 
    '''
        docstring 
    '''

通常、 Docstringは良い考えです。

グローバルの適切な使用に関する詳細については、この質問を確認してください。あなたの状況について私が知っていることに基づいて、それらを使用する必要はないと思います。

    response = urllib.request.urlopen(website_url)
    variable_for_raw_data = response.read()
    return variable_for_raw_data

`if name == ' main ':について知らない場合は、よく読んでください。

if __name__ == "__main__":

意味のある変数名を使用し、ビルトインをオーバーライドしないことを忘れないでください (つまり、file = "foo.txt" はビルトイン ファイルをオーバーライドします)。

    file_name = input("What will this data be saved as: ")
    html_from_website = htmlfrom("www.stackoverflow.com")

コンテキスト マネージャーの詳細については、こちらをご覧ください。

    with open(file_name, 'w') as f: 
        f.write(html_from_website)

FOR WHICH NO USE CASE EXISTS AT ALLglobals()を使用した編集。

def htmlfrom(website_url):
    import urllib.request
    response = urllib.request.urlopen(website_url)
    variable_for_raw_data =(input("What will this data be saved as: "))
    globals()[variable_for_raw_data] = response.read()
于 2013-03-21T17:06:38.747 に答える