精细代码不会作为一个函数运行

时间:2013-12-06 05:14:05

标签: python

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

追踪(最近一次通话): 文件“test.py”,第29行,in 打印tracknumber NameError:名称'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

3 个答案:

答案 0 :(得分:1)

您需要从函数返回值并将它们分配给全局范围内的变量,否则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

答案 1 :(得分: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()
    
  • 使用全局语句,以便为函数中的变量赋值实际分配给全局范围:

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

答案 2 :(得分:0)

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