通用包装函数Python模块开发:基于命令行参数调用不同实现
嘿,我来给你分享一个简洁且可扩展的实现思路,刚好匹配你要做的这个包装器模块需求!
实现方案详解
1. 先明确项目目录结构
先把你的项目结构捋清楚,这样后续代码逻辑更清晰:
your_project/ ├── main.py ├── tools/ │ └── profile.py ├── machineA/ │ └── measure.py └── machineB/ └── measure.py
2. tools/profile.py 的实现
这里我们用动态导入的方式来根据命令行参数加载对应的measure模块,同时做一些错误处理,避免传入未知机器类型时崩溃:
import argparse import importlib def profile(): # 解析命令行参数,限制可选机器类型,自动生成帮助信息 parser = argparse.ArgumentParser(description='Run measurement for specific machine') parser.add_argument('--machine', required=True, choices=['machineA', 'machineB'], help='Specify the machine type: machineA or machineB') args = parser.parse_args() try: # 动态导入对应机器的measure模块 measure_module = importlib.import_module(f'{args.machine}.measure') # 调用模块中的核心measure函数 measure_module.measure() except ImportError as e: print(f"Error loading measurement module for {args.machine}: {e}") except AttributeError: print(f"The measure module for {args.machine} doesn't have a 'measure' function!") if __name__ == '__main__': profile()
代码亮点说明
- 用
argparse处理参数既保证合法性(通过choices限定可选值),又能自动生成友好的帮助提示,不用自己写参数校验逻辑。 importlib.import_module实现动态导入,以后新增机器类型(比如machineC),只需要添加对应的目录和measure.py,完全不用修改profile.py,完美符合开闭原则。- 加入异常捕获,处理模块不存在或者模块中没有
measure函数的情况,让程序更健壮,不会因为小问题直接崩溃。
3. main.py 的调用方式
在main.py里直接调用profile函数就行,非常简洁:
from tools.profile import profile if __name__ == '__main__': profile()
4. 后续扩展建议
- 如果要新增
machineC,只需要创建machineC/measure.py并实现measure()函数,profile.py不需要任何改动。 - 如果需要给
measure()传递额外参数,可以在argparse里添加对应参数,然后传递给函数,比如:parser.add_argument('--sample-size', type=int, default=100, help='Sample size for measurement') # ... measure_module.measure(args.sample_size) - 要是机器类型特别多,可以把可选类型做成配置文件(比如JSON),从配置文件读取选项,这样不用修改代码就能新增机器支持。
内容的提问来源于stack exchange,提问作者Mitesh
相关产品推荐
相关产品推荐

