gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:03:33 25 4
gpt4 key购买 nike

我主要使用 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 对象中已经存在的属性重命名到全局命名空间中,开始出现错误我。

最佳答案

可以使用globals来做到这一点:

globals().update(args.__dict__)

但是,您真的*不应该那样做。源自python之禅,

Namespaces are one honking great idea -- let's do more of those!

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

Don't. Just don't. I'd use args directly instead.

尽可能把东西分开。它使代码更易于维护和更容易理解。

关于Python argparse parse_args 到全局命名空间(或者这是一个坏主意的原因),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19299635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com