2011-10-26 12 views
24

谷歌有一個Python教程,和他們所描述的樣板代碼爲「不幸」,並提供這個例子:Python中的「Boilerplate」代碼?

#!/usr/bin/python 

# import modules used here -- sys is a very standard one 
import sys 

# Gather our code in a main() function 
def main(): 
    print 'Hello there', sys.argv[1] 
    # Command line args are in sys.argv[1], sys.argv[2] .. 
    # sys.argv[0] is the script name itself and can be ignored 

# Standard boilerplate to call the main() function to begin 
# the program. 
if __name__ == '__main__': 
    main() 

被描述爲「看似重複的代碼,一次又一次地表明瞭現在,我聽說樣板代碼爲了得到一些似乎應該更簡單的結果「(example)。上面的例子中

不管怎麼說,在Python中,部分認爲是 「樣板」 的代碼是:

if __name__ == '__main__': 
    main() 

現在,我的問題如下:

1)是否樣板代碼在Python(如所提供的例子)採用與我提供的定義相同的定義?如果是這樣,爲什麼?

2)此代碼是否必要?在我看來,代碼運行是否存在主要方法。是什麼使得這個代碼更好?它更好嗎?

3)爲什麼我們使用該代碼以及它提供了哪些服務?

4)這是否發生在整個Python?是否還有其他「樣板代碼」的例子?

哦,只是一個題外話的問題:你需要import sys在Python中使用命令行參數?如果它不在那裏,它如何處理這樣的論點?

+4

無論您是否導入它,都會存在'sys'。如果你不這樣做,你就不能在你的代碼中使用它。 –

+0

關於這個特定的樣板代碼,你應該總是使用'#!/ usr/bin/env python'而不是'!/ usr/bin/python',因爲這會得到用戶/環境特定的python版本。這是更可取的,因爲用戶可以讓python調用別的東西或者安裝在/ bin之外的位置,儘管這些事情通常都不是真的。然而,作爲處理這個錯誤的人,我可以告訴你他們非常沮喪。它的類似於硬編碼路徑或使用相對路徑之間的區別。 – guribe94

+0

例如Python 2和3的樣板,請看[python-boilerplate.com](https://www.python-boilerplate.com) –

回答

17
  1. 它是重複的,它對於每個可能從命令行執行的腳本都會重複。
  2. 如果你把你的主代碼放在這樣的函數中,你可以導入模塊而不執行它。這有時很有用。它也讓事情更有組織。
  3. 同#2,據我可以告訴
  4. 的Python通常是避免樣板不錯。它非常靈活,在大多數情況下,您可以編寫代碼來生成樣板,而不用編寫樣板代碼。

題外話問題:

如果你不寫代碼來檢查參數,它們將被忽略。

2

你使用「if main」檢查的原因是你可以有一個模塊在頂層運行它的代碼的一部分(創建東西 - 常量,函數或類 - 導出),還有一些部分僅當作爲腳本執行時(例如,單元測試其功能)。

原因後者代碼應被包裹在一個功能是因爲main()塊的局部變量會泄漏到模塊的範圍。現在

,一個備用的設計可能是作爲腳本執行的文件必須聲明一個名字,比如說,__main__()功能,但是這將意味着增加一個新的神奇功能名稱的語言,而__name__機制已經那裏。 (並且不能刪除,因爲每個模塊必須有一個__name__,並且作爲腳本執行的模塊必須具有「特殊」名稱,因爲分配模塊名稱的方式。)引入兩種機制來做同樣的事情只是爲了擺脫兩行樣板 - 通常是兩行樣板每個應用程序 - 似乎並不值得。

1

1)主樣板是常見的,但不能有任何簡單

2)main()不叫沒有樣板

3)樣板允許模塊的使用既作爲獨立的腳本,作爲在其他程序中的庫

4)這很常見。 doctest是另一個。

培養成爲一名Python大師......祝你的論文好運! ;-)

6

在這種情況下if __name__ == "__main__":塊被稱爲boilerplate的原因在於它複製了許多其他語言中自動執行的功能。在Java或C++等許多其他應用程序中,當您運行代碼時,它會查找main()方法並運行它,甚至在不存在的情況下投訴。 Python會運行文件中的任何代碼,因此您需要告訴它運行main()方法;一個簡單的替代方法是將main()方法運行爲默認功能。

因此,if __name__ == "__main__":是一個可能更短的常見模式。沒有理由你不能做一些不同的事情,比如:

if __name__ == "__main__": 
    print "Hello, Stack Overflow!" 

    for i in range(3): 
    print i 

    exit(0) 

這會工作得很好;儘管我的例子有點愚蠢,但你可以看到你可以放任何你喜歡的東西。 Python設計者通過自動運行main()方法(可能不存在)選擇了這種行爲,大概是因爲Python是一種「腳本」語言;所以你可以直接在文件中寫入一些命令,運行它並執行命令。我個人更喜歡Python的方式,因爲它讓初學者更容易啓動Python,並且擁有Hello World是一行的語言總是不錯的。

+1

我見過一些運行測試的模塊,如果直接運行它們,並且偶爾使用了相同的方法。非常方便,以確保您在開發過程中不會破壞某些東西。當作爲模塊導入時,當然,測試不會運行。 – kindall

0

讓我們花點時間來看看發生了什麼,當你叫import sys

  • 的Python着眼於列表和sys模塊帶來
  • 它發現argv功能,並運行它

那麼,這裏發生了什麼?

其他地方編寫的函數正用於執行當前程序範圍內的某些操作。以這種方式編程有很多好處。它將邏輯從實際的勞動中分離出來。

現在,只要樣板而言,有兩個部分:

  • 程序本身(邏輯),main下定義的,並且
  • ,檢查是否main存在
  • 呼叫部

您基本上在main下使用您在定義main(或別處)之前定義的所有函數編寫程序,並讓Python查找main

1

對於不打算成爲大型項目一部分的腳本,您不需要添加if __name__ == '__main__'。請參閱here以獲得很好的解釋。如果你想單獨運行這個文件並且將它作爲一個模塊與其他python文件一起包含,你只需要它。

如果你只是想運行一個文件,你可以有零樣板:

print 1 

$ python your_file.py

Adding the shebang line#!/usr/bin/python運行它,並運行chmod +x print_one.py讓你與

運行的能力

./print_one.py

最後,# coding: utf-8允許你添加unicode到你的文件,如果你想把❤的所有地方。