2

我目前正在使用 Python,并且对函数列在__main__. 我一直在查看多个 python 脚本,试图找到一个共同的主题,即哪些函数需要在 中占有一席之地__main__,但无济于事。在这里,我有一个我自己的代码示例。firstfunction并且 anotherfunction是我的代码中仅有的两个函数。

def main(argv):

    firstinput=""
    secondinput=""

    if len(argv) < 3 or len(argv) > 3:
        print """"Please set to:
                metisfinal.main(metisfinal.py, firstinput, secondinput)""""
        return
    else:
        firstinput = argv[1]
        secondinput = argv[2]

    firstfunction(firstinput, dictionary)
    anotherfunction(list, secondinput)

if __name__ == "__main__":
    main(sys.argv)

(我认为)我知道参数和__main__调用是正确的,但 firstfunction总是anotherfunction返回错误(因为它们的参数不是全局定义的)。我很肯定这是由于对 的错误理解引起的__main__,因为我看过的所有其他示例基本上都是__main__以相同的方式设置的。

什么构成在中列出特定功能__main__?我偶然发现了一些 Python 代码,其中包含超过 30 个函数,但程序员仅在__main__. 同样,有时代码会在主要参数中包含类,例如这个(Project之前定义为对象类):

def main(argv):

    filename = ""
    outputfilename = ""

    p = Project(filename, outputfilename, subdomainNames) 
    p.generateICs()

if __name__ == "__main__":
    main(sys.argv)

从概念上讲,我不明白为什么没有列出所有功能......不是所有功能都需要运行还是__main__只是在初始化某些东西?

我在看非典型代码吗?__main__我错过了哪些关键概念?一旦我找到了要放入的函数__main__,是否有特定的方法来格式化它们?

4

2 回答 2

8

目前尚不清楚您所说的“列在__main__”中是什么意思。 __main__不是源文件中的实体。相反,它是模块的名称,如果您直接执行它。当你这样做时if __name__=="__main__",你是在告诉 Python 当且仅当代码作为主模块执行时才执行该块中的代码——也就是说,如果它是一个正在运行的程序。如果模块是从另一个模块导入的,则块中的代码if __name__=="__main__"将不会运行。

请注意,您不会在该 if 块中“列出”函数。相反,您将常规程序代码放在要运行的那个块中。通常这段代码只调用一个函数。人们经常调用那个函数main()__main__但和之间没有特殊关系main。您可以随意调用该函数:

def snicklefritz():
    # This function will be run when you run the program
    print "You ran the program!"

if __name__ == "__main__":
    snicklefritz()

尝试运行该程序(例如,将其保存为“snicklefritz.py”,然后python snicklefritz.py从命令行执行)。你会看到“你运行了程序!” 打印。相反,如果您创建一个单独的文件,则import snicklefritz不会打印该消息。

请注意,没有关于“列出函数”的内容。例如,看这个程序:

print "This will always be printed!"

if __name__ == "__main__":
    print "This will only be printed if you run the file as a program!"

这里的if __name__=="__main__"块没有“列出”任何功能。它只包含文件作为脚本运行时运行的实际代码。但是,人们通常不会这样做,因为将代码放在单独的函数中而不是仅仅“暴露”在函数之外会更整洁。

至于其他功能,您可以在模块中定义您喜欢的任何其他功能,在该模块中使用,或由导入您的模块的其他模块使用。通常,模块中的大多数功能不会在if __name__=="__main__"块内使用,因为它们不会成为“主”功能的一部分。相反,它们将是供其他代码使用的其他函数。例如:

def otherFunc(x):
    # Return x squared
    return x**2

def snicklefritz():
    # This function will be run when you run the program
    print "You ran the program!"

if __name__ == "__main__":
    snicklefritz()

otherFunc在模块中根本没有使用。没关系。可能有人会想要导入您的模块并otherFunc自己使用。并非每个函数都必须在同一个模块中使用,更不用说从if __name__=="__main__"块中调用了。

于 2012-06-29T19:27:25.110 回答
3

你误会__main__成语了。

考虑下面的程序,保存在一个名为的文件中sum.py

def read_numbers():
    n1 = int(raw_input())
    n2 = int(raw_input())
    return n1, n2

def sum_numbers(i1, i2):
    return i1+i2

def print_sum(i1, i2, i3):
    print "%d + %d = %d" % (i1, i2, i3)

v1, v2 = read_numbers()
sum = sum_numbers(v1, v2)
print_sum(v1, v2, sum)

它具有三个功能 - 一个从标准输入读取两个数字,另一个将它们相加,第三个打印操作。定义函数后,我以读取两个数字并打印其总和的方式调用它们。相当容易。如果我执行它,我会得到如下信息:

$ python sum.py 
12
34
12 + 34 = 46

现在,假设我需要编写另一个程序,它只读取一个数字——实际上给出了另一个数字。由于我已经有一个sum_numbers()函数和一个print_sum()函数,我可以重用sum模块,这是一件好事:

import sum
MY_FIXED_NUMBER=3
n = int(raw_input())
value = sum.sum_numbers(n, MY_FIXED_NUMBER)
print_sum(n, MY_FIXED_NUMBER, value)

伟大的!但是,如果我执行它,我得到了什么?这:

$ python three_sum.py 
12
34
12 + 34 = 46
12
12 + 3 = 15

哇?!程序要求我输入两个数字,打印它们的总和,然后要求输入第三个数字,它的总和正确为 3。我只是想被要求输入第三个数字,然后打印总和与 3!发生了什么?

碰巧,当我导入一个模块(例如import sum)时,它里面的所有代码都会被执行。因此,我的模块有两个部分,一个定义了可以在其他地方使用的有用函数(我将其称为定义部分),另一个部分是它以某种方式执行此函数以获得特定结果,因此我可以使用模块作为程序(我将其称为执行部分)。执行部分总是被执行。

幸运的是,Python 有一个技巧,可以让我仅在未导入模块时才执行执行部分。如果我使用 导入 Python 文件import,模块将有一个名为 的变量__name__,其名称将是模块的原始名称:

>>> import sum
12
34
12 + 34 = 46
>>> sum.__name__
'sum'

但是,如果我将 Python 文件作为脚本 ( $ python sum.py) 运行,则__name__变量将存在,但名称不同。假设我添加了一行,例如

print __name__

在我的结尾sum.py。当我再次运行它时,我得到了它:

$ python sum.py
12
34
12 + 34 = 46
__main__

另一方面,如果我运行three_sum.py,结果print __name__是不同的:

$ python three_sum.py 
12
34
12 + 34 = 46
sum
12
12 + 3 = 15

是的,__name__将文件作为脚本运行时变量的值是__main__.

那么,这对我有什么帮助?这样:我会将模块的执行部分放在一个if条件中。如果模块的名称是__main__,那是因为文件作为脚本运行$ python sum.py- 在这种情况下,我应该执行模块的执行部分。所以我的sum.py模块现在是这样的:

def read_numbers():
    n1 = int(raw_input())
    n2 = int(raw_input())
    return n1, n2

def sum_numbers(i1, i2):
    return i1+i2

def print_sum(i1, i2, i3):
    print "%d + %d = %d" % (i1, i2, i3)

if __name__ == "__main__":
    v1, v2 = read_numbers()
    sum = sum_numbers(v1, v2)
    print_sum(v1, v2, sum)

如果我运行$ python sum.py,我会得到与以前相同的结果:

$ python sum.py
12
34
12 + 34 = 46

但是,如果我运行three_sum.py,一切都会不同:

$ python three_sum.py 
12
12 + 3 = 15

现在这按预期工作。之所以这样工作,是因为第一次执行的模块名是__main__,所以执行下面的命令if __name__ == "__main__" 。但是,在第二次执行中,模块的名称是sum,所以if没有执行下面的命令。

即使您的文件不是为导入而设计的,将文件的执行部分放在 下仍然是一个好习惯if __name__ == "__main__",因此您的文件很容易适应成为一个模块。

于 2012-06-29T19:59:14.723 回答