天天看點

python主函數方法執行_了解python的主方法 main method

本問題已經有最佳答案,請猛點這裡通路。

我對python不熟悉,但我有其他oops語言的經驗。我的課程沒有解釋Python中的主要方法。

請告訴我Python中的主要方法是如何工作的?我很困惑,因為我試圖把它比作Java。

def main():

# display some lines

if __name__ =="__main__": main()

主要是如何執行的,為什麼我需要這個奇怪的if來執行main。當我删除if時,我的代碼在沒有輸出的情況下終止。

最小碼-

class AnimalActions:

def quack(self): return self.strings['quack']

def bark(self): return self.strings['bark']

class Duck(AnimalActions):

strings = dict(

quack ="Quaaaaak!",

bark ="The duck cannot bark.",

)

class Dog(AnimalActions):

strings = dict(

quack ="The dog cannot quack.",

bark ="Arf!",

)

def in_the_doghouse(dog):

print(dog.bark())

def in_the_forest(duck):

print(duck.quack())

def main():

donald = Duck()

fido = Dog()

print("- In the forest:")

for o in ( donald, fido ):

in_the_forest(o)

print("- In the doghouse:")

for o in ( donald, fido ):

in_the_doghouse(o)

if __name__ =="__main__": main()

你不需要if,你可以隻寫main(),也可以工作。

@魯本伯穆德茲的壞主意,這違背了全部要點。使用主函數可以将檔案導入到repl中而不作為腳本運作,這就是if語句所做的。如果您不使用if,腳本将在您不希望的時間運作,例如導入該子產品。

@Alexthornton這是否意味着您不應該使用main()作為包裝函數?如果是這樣的話,對于這樣的包裝器函數是否有某種命名約定?

@[email protected]的意思是,直接調用main(),而不使用if,是一個壞主意。定義名為main的函數完全沒有問題。即使你稱之為my_entry_point,這不是問題,但問題是如果你無條件地稱my_entry_point(),而沒有if。重點是沒有if==壞主意。

"main"的python方法對于語言(*)幾乎是唯一的。

語義有點微妙。__name__辨別符在導入時綁定到任何子產品的名稱。但是,在執行檔案時,__name__設定為"__main__"(文字字元串:__main__)。

這幾乎總是用來将應該執行的代碼部分與定義功能的代碼部分分開。是以,python代碼通常包含如下行:

#!/usr/bin/env python

from __future__ import print_function

import this, that, other, stuff

class SomeObject(object):

pass

def some_function(*args,**kwargs):

pass

if __name__ == '__main__':

print("This only executes when %s is executed rather than imported" % __file__)

使用此約定,可以有一個檔案定義類和函數,用于其他程式,還可以包含僅當檔案作為獨立腳本調用時才計算的代碼。

重要的是要了解,在這兩種情況下,if __name__行上面的所有代碼都正在執行、評估中。它由解釋器在檔案導入或執行時進行評估。如果您将print語句放在if __name__行之前,那麼每當任何其他代碼試圖将其作為子產品導入時,它都會列印輸出。(當然,這是反社會的。不要那樣做。

我個人喜歡這些語義。它鼓勵程式員将功能(定義)與功能(執行)分開,并鼓勵重用。

理想情況下,如果從指令行調用,幾乎每個Python子產品都可以做一些有用的事情。在許多情況下,這用于管理單元測試。如果一個特定的檔案定義了僅在系統其他元件上下文中有用的功能,那麼仍然可以使用__name__ =="__main__"來隔離一個代碼塊,該代碼塊調用一組适用于該子產品的單元測試。

(如果您沒有任何這樣的功能或單元測試,最好確定檔案模式不可執行)。

小結:if __name__ == '__main__':有兩個主要的用例:

允許子產品提供導入到其他代碼的功能,同時作為獨立腳本(圍繞功能的指令行包裝器)提供有用的語義。

允許子產品定義一組單元測試,這些測試與要測試的代碼一起存儲(在同一個檔案中),并且可以獨立于代碼庫的其餘部分執行。

它對于def main(*args)是相當常見的,如果您希望以類似于其他程式設計語言的方式定義main,那麼if __name__ == '__main__':隻需調用main(*sys.argv[1:])。如果您的.py檔案主要用于在其他代碼中用作子產品,那麼您可以使用def test_module()并在if __name__ == '__main__:'套件中調用test_module()。

(Ruby還實作了類似的特性if __file__ == $0)。

值得注意的是,在if name='main':構造中,對于Python來說沒有什麼特别的地方。就像其他條件語句一樣…您可以有多個if-name='main':它們的功能與任何其他Python腳本中的任何其他條件和語句套件一樣。

另外,__name__ =="__main__"之外的語句隻在您第一次導入給定會話中的子產品以及顯式重新加載子產品時運作。這就是為什麼修改源代碼和嘗試導入通常不能按預期工作的原因。

在Python中,執行不必從main開始。"可執行代碼"的第一行先執行。

def main():

print("main code")

def meth1():

print("meth1")

meth1()

if __name__ =="__main__":main() ## with if

輸出-

meth1

main code

關于main()的更多資訊-http://ibiblio.org/g2swap/byteofpython/read/module-name.html

子產品的__name__。

每個子產品都有一個名稱,子產品中的語句可以找到子產品的名稱。這在一種特殊情況下特别友善——如前所述,當第一次導入子產品時,該子產品中的主塊将運作。如果我們隻想在程式本身使用而不是從另一個子產品導入時運作該塊呢?這可以通過使用子產品的name屬性來實作。

使用子產品的名稱__

#!/usr/bin/python

# Filename: using_name.py

if __name__ == '__main__':

print 'This program is being run by itself'

else:

print 'I am being imported from another module'

輸出-

$ python using_name.py

This program is being run by itself

$ python

>>> import using_name

I am being imported from another module

>>>

它是如何工作的

每個python子產品都定義了它的__name__,如果定義了__main__,則意味着該子產品是由使用者獨立運作的,我們可以執行相應的操作。

實際上,執行的第一行是def main():。

@瘋子實體學家隻是想說清楚:首先執行是因為它是第一行,而不是因為它是def main()。

@尼特沃德凱特。對的。對名稱main沒有特别說明。整個子產品逐行執行,自上而下。執行每個def和class語句以在子產品命名空間中建立函數和類對象。這些對象由代碼和中繼資料組成,在顯式調用之前不會運作這些代碼和中繼資料。

Python沒有定義的入口點,如Java、C、C++等,而是簡單地逐行執行源檔案。if語句允許您建立一個main函數,如果您的檔案作為"主"子產品而不是作為另一個子產品中的庫加載,該函數将被執行。

清楚地說,這意味着Python解釋器從檔案的第一行開始并執行它。執行諸如class Foobar:和def foobar()之類的行可以建立一個類或一個函數,并将它們存儲在記憶體中以供以後使用。

你能告訴我在我的代碼中哪一行是先執行的嗎?

第一行首先執行。

通常在if __name__ =="__main__"行之前有類和函數定義,是以這些定義将首先執行。

如果從另一個python腳本導入正在建立的子產品(.py)檔案,它将不會在

if __name__ == '__main__':

...

如果您直接從控制台運作腳本,它将被執行。

python不使用或不需要main()函數。任何不受該保護的代碼将在子產品執行或導入時執行。

這在python.berkely.edu中進行了更多的擴充。