从具有位置参数的Python模块导入函数

1 投票
1 回答
1224 浏览
提问于 2025-04-21 06:57

我有一个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 这两个函数,而不必让它们自动运行。

撰写回答