2014-09-12 34 views
0

我有一個使用位置命令行參數(使用argparse)並在此參數上執行函數的Python(3.4)模塊(稱爲'file_1.py'):從具有位置命令行參數的Python模塊導入函數

# set up command line parser 
import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('n', '--number', type=int, required=True, help='some number') 

# read command line argument 
args = parser.parse_args() 
parsed_number = args.number 

# function to do some math 
def add_one_to_number(x) 
    return x+1 

# use the function 
print(add_one_to_number(parsed_number)) 

現在,進口和從另一模塊( 'file_2.py')調用函數,

from file_1 import add_one_to_number 
print(add_one_to_number(1)) 

,當我得到的錯誤file_2: error: the following arguments are required: -n/--number

我知道這是因爲導入的代碼是在使用import語句後執行的,因此需要位置命令行參數。但是,有沒有辦法導入該函數,而不以任何方式將位置命令行參數傳遞給file_1?背景是我想對函數做一些單元測試,並且據我所知,測試像我的函數這樣的代碼單元不應該依賴於傳遞的命令行參數。

回答

2

爲了防止代碼模塊時導入運行時,它直接調用它之前,通常定義main()入口點函數和測試腳本是否正在運行:

if __name__ == "__main__": 
    main() 

在你的情況,你可以這樣做:

import argparse 

def parse_args(): 
    """Parse command line arguments.""" 
    parser = argparse.ArgumentParser() 
    parser.add_argument('n', '--number', type=int, required=True, 
         help='some number') 
    return parser.parse_args() 

def add_one_to_number(x): 
    """Function to do some math.""" 
    return x + 1 

if __name__ == "__main__": 
    args = parse_args() 
    print(add_one_to_number(args.number)) 

現在你可以import兩個功能,而不必運行它們。