Python:在 main() 中访问 __version__ 的最优雅方式

Python: most elegant way of accessing __version__ inside main()

我正在创建一个小的 Python 3 程序,它使用 argparse 接受命令行参数。这个库有一种自动处理版本标志的方法。我试图弄清楚在我的 main() 函数中访问 version 的最优雅的方式是什么。

#!/usr/bin/env python3

import argparse


def main():

    __version__ = '0.1.0'

    parser = argparse.ArgumentParser()
    parser.add_argument('input',
                        type=str,
    parser.add_argument('-v', '--version',
                        action='version',
                        version='%(prog)s ' + __version__
                        )
    args = parser.parse_args()

    # main code
    print('foo bar')


if __name__ == '__main__':
    main()

那么这里最优雅的解决方案是什么?

1) 做我上面做的,然后忍受它。

2) 将 __version__ 留在 main() 之外并将其作为参数传递给 main()(尽管我一直认为在 main() 中使用参数是不好的做法函数)

3) 将 __version__ and all parser setup outsidemain()and pass the variableargs` 作为参数留给 main()(又是不好的做法)。

4) 使用全局变量

或者我误认为向 main() 发送参数是不好的做法?或者,我是否完全错过了另一个解决方案?

#!/usr/bin/env python3

import argparse
__version__ = '0.1.0'

def main():
    # optionally put this argparse code in its own function
    parser = argparse.ArgumentParser()
    parser.add_argument('input',
                        type=str)
    parser.add_argument('-v', '--version',
                        action='version',
                        version='%(prog)s ' + __version__
                        )
    args = parser.parse_args()

    # main code
    print(args)
    print('foo bar')

if __name__ == '__main__':
    main()

测试

1136:~/mypy$ python3 stack57822847.py foobar
Namespace(input='foobar')
foo bar
1136:~/mypy$ python3 stack57822847.py -v
stack57822847.py 0.1.0