从具有位置参数的Python模块导入函数
我有一个Python模块(叫做'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的情况下导入这个函数呢?背景是我想对这个函数进行单元测试,而据我所知,测试代码的某个部分不应该依赖于传递的命令行参数。
1 个回答
3
为了防止代码在模块被导入时自动运行,通常会定义一个 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
这两个函数,而不必让它们自动运行。