如何在昂贵的导入之前优雅地解析 python 中的参数?
how to elegantly parse argumens in python before expensive imports?
我有一个脚本,它解析一些参数,并有一些昂贵的导入,但只有在用户提供有效输入参数时才需要这些导入,否则程序将退出。此外,当用户说 python script.py --help
时,根本不需要执行那些昂贵的导入。
我能想到这样的脚本:
import argparse
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument('--argument', type=str)
args = parser.parse_args()
return args
if __name__ == "__main__":
args = parse_args()
import gensim # expensive import
import blahblahblah
def the_rest_of_the_code(args):
pass
if __name__ == "__main__":
the_rest_of_the_code(args)
这样就可以了,但我觉得它并不优雅。对任务有更好的建议吗?
编辑:进口真的很贵:
$ time python -c "import gensim"
Using TensorFlow backend.
real 0m12.257s
user 0m10.756s
sys 0m0.348s
您可以有条件地导入,或者在 try
块中,或者几乎在代码中的任何地方。
所以你可以这样做:
import cheaplib
if __name__ == "__main__":
args = parse_args()
if expensive_arg in args:
import expensivelib
do_stuff(args)
或者更清楚,只在将使用它的函数中导入库。
def expensive_function():
import expensivelib
...
不确定它是否比您已有的更好,但您可以延迟加载它:
def load_gensim():
global gensim
import gensim
如果您只想确保参数有意义,您可以使用包装器 main
模块来检查参数,然后加载另一个模块并调用它。
main.py:
args = check_args()
if args is not None:
import mymodule
mymodule.main(args)
mymodule.py:
import gensim
def main(args):
# do work
我有一个脚本,它解析一些参数,并有一些昂贵的导入,但只有在用户提供有效输入参数时才需要这些导入,否则程序将退出。此外,当用户说 python script.py --help
时,根本不需要执行那些昂贵的导入。
我能想到这样的脚本:
import argparse
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument('--argument', type=str)
args = parser.parse_args()
return args
if __name__ == "__main__":
args = parse_args()
import gensim # expensive import
import blahblahblah
def the_rest_of_the_code(args):
pass
if __name__ == "__main__":
the_rest_of_the_code(args)
这样就可以了,但我觉得它并不优雅。对任务有更好的建议吗?
编辑:进口真的很贵:
$ time python -c "import gensim"
Using TensorFlow backend.
real 0m12.257s
user 0m10.756s
sys 0m0.348s
您可以有条件地导入,或者在 try
块中,或者几乎在代码中的任何地方。
所以你可以这样做:
import cheaplib
if __name__ == "__main__":
args = parse_args()
if expensive_arg in args:
import expensivelib
do_stuff(args)
或者更清楚,只在将使用它的函数中导入库。
def expensive_function():
import expensivelib
...
不确定它是否比您已有的更好,但您可以延迟加载它:
def load_gensim():
global gensim
import gensim
如果您只想确保参数有意义,您可以使用包装器 main
模块来检查参数,然后加载另一个模块并调用它。
main.py:
args = check_args()
if args is not None:
import mymodule
mymodule.main(args)
mymodule.py:
import gensim
def main(args):
# do work