【问题标题】:Fine code won't run as a function精细代码不会作为函数运行
【发布时间】:2013-12-06 05:14:05
【问题描述】:

我正在尝试定义一个要在更大程序中使用的函数,但是当我运行它时,我得到了以下输出:

Traceback(最近一次调用最后一次): 文件“test.py”,第 29 行,在 打印轨道号 NameError: name 'tracknumber' 未定义

如果我不把它写成函数(不带def),代码运行良好

有什么想法吗?

import subprocess

filename = raw_input("Path?")

def metadata():

    pipe = subprocess.Popen(
        ["metaflac", "--show-tag=tracknumber", filename], stdout=subprocess.PIPE)
    tracknumber, error = pipe.communicate()
    tracknumber = tracknumber.replace("TRACKNUMBER=", "")    
    tracknumber = tracknumber.rstrip()
    if int(tracknumber) < 10:
        tracknumber = "0" + tracknumber

    pipe = subprocess.Popen(
        ["metaflac", "--show-tag=title", filename], stdout=subprocess.PIPE)
    title, error = pipe.communicate()
    title = title.replace("TITLE=", "")
    title = title.rstrip()

    pipe = subprocess.Popen(
        ["metaflac", "--show-tag=artist", filename], stdout=subprocess.PIPE)
    artist, error = pipe.communicate()
    artist =  artist.replace("ARTIST=", " - ")
    artist = artist.rstrip()

metadata()

print tracknumber
print artist
print title

【问题讨论】:

  • 你需要了解变量的作用域。希望this链接对你有帮助

标签: python


【解决方案1】:

您在函数内部创建的变量是该函数的本地变量,因此当您尝试在函数外部访问它们时,将找不到它们并且您会收到错误消息。

这里有两种解决方法:

  • 返回你需要在函数外使用的值,让调用者处理它们:

    def metadata():
        # all of your current code
    
        # add this to the bottom
        return tracknumber, artist, title
    
    # save the returned values to global variables
    tracknumber, artist, title = metadata()
    
  • 使用 global 语句,以便分配给函数中的变量实际上是分配给全局范围:

    def metadata():
        global tracknumber, artist, title
        # all of your current code
    

【讨论】:

    【解决方案2】:

    您需要从函数返回值并将它们分配给全局范围内的变量,否则tracknumberartisttitle 将引发NameError,因为它们不存在于全局范围内。

    函数可以访问全局范围内定义的变量(filename),但函数内部定义的变量不能在函数外访问。

    def metadata():
    
        pipe = subprocess.Popen(
            ["metaflac", "--show-tag=tracknumber", filename], stdout=subprocess.PIPE)
        tracknumber, error = pipe.communicate()
        ...
        ... 
        artist = artist.rstrip()
        return tracknumber, artist, title  #return variables at end
    
    tracknumber, artist, title = metadata()
    
    print tracknumber
    print artist
    print title
    

    【讨论】:

      【解决方案3】:

      在您的代码中,变量 tracknumber、artist 和 title 的范围是函数的本地变量。为了访问这些变量,要么将它们声明为全局变量,要么返回这些变量。

      【讨论】:

        猜你喜欢
        • 2014-02-08
        • 1970-01-01
        • 1970-01-01
        • 2015-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多