2015-11-13 55 views
2

我看到了很多的Python代碼看起來像這樣:`def main(args):`在python中有意義嗎?

def do_something(arg): 
    # some stuff 

def do_something_else(arg): 
    # some other stuff 

def main(args): 
    do_something(args.an_arg) 
    do_something_else(args.another_arg) 

if __name__ == "__main__": 
    args = parse_args() 
    main(args) 

我不知道爲什麼/它是否有意義定義main功能。如果函數main是不打算從其他地方進口的,那麼這似乎是完美的:

def do_something(arg): 
    # some stuff 

def do_something_else(arg): 
    # some other stuff 

if __name__ == "__main__": 
    args = parse_args() 
    do_something(args.an_arg) 
    do_something_else(args.another_arg) 

...如果它的目的是從其他地方進口,應給予一個更有意義的名稱(並且以更常見的方式接受參數):

def do_something(arg): 
    # some stuff 

def do_something_else(arg): 
    # some other stuff 

def do_two_things(arg1, arg2): 
    do_something(args.an_arg) 
    do_something_else(args.another_arg) 

if __name__ == "__main__": 
    args = parse_args() 
    do_two_things(args.an_arg, args.another_arg) 

這是正確的嗎?定義一個main函數是否有意義,如上例所示?

+1

使它成爲一個獨特的功能提供了一個固定的切入點,使其更容易測試。 – chepner

+0

我一直在用ad-hoc創建的模塊來做這個...然後添加一個'main2()'或其他名字來測試功能。 – Gerrat

回答

1

...如果它的目的是從其他地方進口的,它應該是 給出一個更有意義的名稱(以及更常見的 方式接受參數)

的主要原因贊成這裏的通用名稱,如main專門用於泛型:即用於多態性。

例如,假設您有一堆您想要測試的模塊,這些模塊被設計爲獨立執行(不從其他模塊導入)。但是爲了測試它們,您希望使用python腳本創建一個臨時目錄,用生成的文件填充爲測試內容,然後以通用方式執行每個模塊,而不考慮每個單一模塊的獨特區別你想以這種方式進行測試。

要做到這一切所有在Python中,你需要這些模塊,你想測試有一個共同的標識符爲所有主要的入口點功能,無論是main或其他(關鍵是它是相同的所有模塊給他們一個統一的公共接口)。所有這些函數的主要入口點函數的名稱都必須相當不簡單,因爲函數是該模塊的主入口點,因爲每個模塊都必須導出一個與下一個模塊名稱相同的函數爲了允許依賴於每個模塊的這種多形代碼提供統一的公共接口。

當在這種類型的上下文中需要多態性時,無論是用於類還是模塊,我們可以使用的最具描述性的名稱都不能考慮太多的細節。它不能考慮每個模塊具體做什麼,因爲它需要在模塊之間統一爲。在這種情況下,我們需要一個非常通用的名稱,並且main是一個非常通用的名稱。

因此,人們可能會喜歡這裏的一個不起眼的名字,而不是完全描述該函數的功能,而是允許一大堆模塊提供具有相同名稱的函數,以便它們都可以以相同方式統一使用完全相同的代碼。

相關問題