我有一个Python(3.4)模块(称为'file_1.py'),它使用位置命令行参数(使用argparse)并对此参数执行函数:
# 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?背景是我想对函数进行一些单元测试,据我所知,测试像我的函数这样的代码单元不应该依赖于传递的命令行参数。
答案 0 :(得分: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
这两个函数而不必运行它们。