Python 参数解析器 - 仅从控制台解析

如何解决Python 参数解析器 - 仅从控制台解析

我可以只从命令行提取解析的参数,而忽略所有认参数吗? 如果用户传递了参数的认值,我希望它也出现在子集中:

parser = argparse.ArgumentParser()
parser.add_argument("--a",type=str,default='a')
parser.add_argument("--b",default='b')
parser.add_argument("--c",default='c')
parser.add_argument("--d",default='d')
python run.py --a "e" --b "b"

我想要

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--a",default='a')
    parser.add_argument("--b",default='b')
    parser.add_argument("--c",default='c')
    parser.add_argument("--d",default='d')

    from_cli = parse_from_cli(parser) # from_cli = {'a':'e','b':'b'}

解决方法

您可以为 parse_args 提供 namespace argumentIn this case,提供的命名空间中的值将优先于解析器中设置的默认值。我们只需要创建一个“掩码”命名空间和一个哨兵对象来覆盖默认值。似乎没有从解析器中提取 args 的公共方法,但我们可以调用解析器两次并使用第一次调用来创建掩码。

import argparse

NOTHING = object()

parser = argparse.ArgumentParser()
parser.add_argument('--foo',default=1,type=int)
parser.add_argument('--bar',default=2,type=int)

args = vars(parser.parse_args())
mask = argparse.Namespace(**{arg: NOTHING for arg in args})

masked_namespace = parser.parse_args(namespace=mask)
masked_args = {
    arg: value
    for arg,value in vars(masked_namespace).items()
    if value is not NOTHING
}

print(masked_args)

在使用中你会得到:

$ python foo.py
{}
$ python foo.py --bar 11
{'bar': 11}
,

您可以省略 default= 函数的 add_argument 参数,然后用户未明确指定的参数将解析为 None

,

您可以将旧参数保存在单独的配置文件中,然后读取和写回更改后的参数。

这应该是这样的:

import argparse

args = {'a':None,'b':None}

with open("config","r") as config:

    parser = argparse.ArgumentParser()
    parser.add_argument("--a",type=str)
    parser.add_argument("--b",type=str)

    newargs = parser.parse_args()


    # set new arguments
    args['a'] = newargs.a
    args['b'] = newargs.b

    # read previous arguments
    for line in config.readlines():
        if ":" in line : 
            temp = line.strip().split(":")
            if not args[temp[0]] :
                args[temp[0]] = temp[1]

with open("config","w") as config:

    # write back new arguments with the newargs
    lines = []
    for key in args.keys() :
        lines.append("{}:{}\n".format(key,args[key]))

    config.writelines(lines)

print(args)

配置文件中的编码当然可以不同,我选择这个是为了调试。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?