Python argparse parse_args到全局命名空间(或者这是一个坏主意的原因)

Mit*_*ops 9 python argparse

我主要使用argparse在python中创建命令行脚本,我通常使用的习惯用法是将参数指定为对象的属性,然后将它们分别解析为与其属性名称匹配的变量.这似乎有点重复.有没有办法将它们全部分配到全局命名空间并删除分配步骤; 或者通常情况下,某些python行为对我来说似乎是违反直觉的,有些明智的,python专家指出,有一个很好的理由我不应该这样做或者想要这样做吗?

我现在拥有的是:

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--db",type=str, dest='db', nargs='?', default="test")
    parser.add_argument("--collection",type=str, dest='collection', nargs='?', help="Collection, default is test", default="test")
    args = parser.parse_args()
    db = args.db                   # gross! 
    collection = args.collection   # yuck!
    print(db)
    print(collection)
Run Code Online (Sandbox Code Playgroud)

我想要的是:

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--db",type=str, dest='db', nargs='?', default="test")
    parser.add_argument("--collection",type=str, dest='collection', nargs='?', help="Collection, default is test", default="test")
    parser.SUPER_parse_args() # now, db and collection are already in the namespace!
    print(db)
    print(collection)
Run Code Online (Sandbox Code Playgroud)

当我只有2个参数时似乎并不多,但是如果我有10个左右,那么将赋值步骤加倍,我在args对象中已经存在的属性重命名为全局命名空间,开始让我感到烦恼.

mgi*_*son 8

可以这样做globals:

globals().update(args.__dict__)
Run Code Online (Sandbox Code Playgroud)

但是,你真的*不应该这样做.从蟒蛇的禅宗,

命名空间是一个很棒的主意 - 让我们做更多的事情吧!

我会回应@Martijn在评论中所说的话:

别.只是不要.我会args直接使用.

保持尽可能分开的东西.它使代码更易于维护和易于理解.

  • @Mittenchops - 这是它的一部分.它还使源更容易阅读.3个月之后,当你需要更新你的脚本并且你看到自己使用变量`foo`时,但当你尝试grep源时,`foo`没有在任何地方定义,那么你开始划伤你的脑袋并想知道如何整个事情都有效. (2认同)