10

我主要使用 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)

我想要的是:

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)

当我只有 2 个参数时,它似乎并不多,但如果我有 10 个左右,加倍分配步骤,我将 args 对象中已经存在的属性重命名到全局命名空间中,开始困扰我。

4

3 回答 3

10

可以使用以下方法执行此操作globals

globals().update(args.__dict__)

但是,你真的不应该这样做。来自蟒蛇之禅,

命名空间是一个很棒的想法——让我们做更多的事情!

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

不。只是不要。我会args直接使用。

尽可能将事物分开。它使代码更易于维护和更容易理解。

于 2013-10-10T15:29:27.697 回答
0

添加到 mgilson 的答案:

考虑locals().update(args.__dict__)改用;这将更新当前命名空间而不是全局命名空间。

您也可以使用 locals() 或 vars() 来执行此操作。请参阅此 Stack Overflow 帖子,以获得关于两者之间差异的很好的解释。

我对 Mittonchops 有点晚了,但希望这对其他人有帮助。

于 2015-01-28T21:47:27.523 回答
0

这就是我所做的。它有助于可变碰撞,但不利于可维护性。

parser_args = parser.parse_args()
if parser_args.verbose:
    globals().update(argparse.Namespace(verbose=parser_args.verbose).__dict__)
于 2017-09-21T15:33:25.553 回答