具有 action='store_true' 的 Argparse 未按预期工作

Argparse with action='store_true' not working as expected

想法是在 运行 脚本时添加一个标志(--slack,或 -s),这样我就不必注释掉 rep.post_report_to_slack() 方法每次我不想使用它。当我 运行:

$ python my_script.py --slack

我收到错误:

my_script.py: error: unrecognized arguments: --slack

代码如下:

def main():
    gc = Google_Connection()
    meetings = gc.meetings

    rep = Report(meetings)

    if args.slack:
        rep.post_report_to_slack()
        print('posted to slack')


if __name__ == '__main__':
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('-s', '--slack', help='post to slack', 
        action='store_true')
    args = parser.parse_args()
    main()

你的代码有效,但它依赖于 args 在模块命名空间中可用,这不是很好,因为一方面,这意味着你不能在不调用脚本的情况下使用你的函数命令行。一种更灵活和传统的方法是编写函数来接受它需要的任何参数,然后将您从 argparse 获得的所有内容传递给函数:

# imports should usually go at the top of the module
import argparse

def get_meeting_report(slack=False):

    gc = Google_Connection()
    meetings = gc.meetings

    rep = Report(meetings)

    if slack:
        rep.post_report_to_slack()
        print('posted to slack')

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-s', '--slack', help='post to slack',
        action='store_true')
    args = parser.parse_args()
    args = vars(args)
    get_meeting_report(**args)

现在您还可以通过直接调用在 argparse 之外更轻松地使用您的函数。