gpt4 book ai didi

python - 我可以检查一个值是默认提供的还是用户提供的?

转载 作者:行者123 更新时间:2023-11-28 16:32:16 25 4
gpt4 key购买 nike

有没有办法在使用 argparse 时判断一个字段是否有值是因为用户指定了它还是因为没有指定并获得了默认值? 注意:我还想考虑用户明确指定默认值的情况。

我想使用 argparse 来处理命令行参数,我想使用 formatter_class=argparse.ArgumentDefaultsHelpFormatter 来显示字段的默认值未指定。此外,我想从配置文件中读取值。

如果用户在命令行上指定了一个值,我想确保我使用该值(即使该值与默认值匹配,但已明确说明)。如果用户没有指定一个值,但在配置文件中找到了一个值,我想使用它。如果用户没有在命令行上指定一个,并且配置文件中没有值,那么我想使用上面的用法声明中显示的默认值。

所以,我可能会像这样设置解析

parser = parser = argparse.ArgumentParser( description="""Tool with many ways to get values""", formatter_class=argparse.ArgumentDefaultsHelpFormatter )
parser.add_argument( '-p', '--path', help="The path to a file to read", default="data.csv" )
parser.add_argument( '-c', '--conf', help="The config file to use", default="config.txt" )

也许还有很多其他的参数。

现在,我还想读取一个配置文件,其中可能包含一个值

data_path = data2.csv

所以如果用户在命令行指定了一个-p,我想读取那个文件;如果他们不这样做,而我使用该配置文件,我想阅读 data2.csv;如果我使用的配置文件没有定义 data_path 并且他们没有指定 -p,我想使用默认的 data.csv.

对我来说最复杂的情​​况是,如果用户指定 -p data.csv 那么它将具有默认值,但应该优先于配置文件。

argparse 或其他类似工具是否有办法判断参数是通过默认设置还是由用户明确设置的?

最佳答案

如果它只是使事情复杂化,请不要指定默认值:

parser.add_argument('-p', '--path', 
help="The path to a file to read")

然后在您的代码中:

if args.path:
# user specify a value for path
# using -p
pass
elif cfg.path:
# user provided a path in the configuration value
args.path = cfg.path
else:
# no value was specified, use some sort of default value
args.path = DEFAULT_PATH

或者,更简洁:

args.path = next(val for val in 
[args.path, cfg.path, DEFAULT_PATH]
if val is not None)

假设在配置文件中没有指定路径时,cfg.path 将为None。所以如果 cfg 实际上是一个字典,cfg.get('path') 会做正确的事情。

只是为了好玩,这里有一个糟糕的想法可以告诉使用默认值和显式指定 a 之间的区别与默认值相同的值:

import argparse

class Default(object):
def __init__(self, value):
self.value = value

def __str__(self):
return str(self.value)

DEFAULT_PATH = Default('/some/path')

def parse_args():
p = argparse.ArgumentParser()
p.add_argument('--path', '-p',
default=DEFAULT_PATH)
return p.parse_args()

def main():
args = parse_args()

if args.path is DEFAULT_PATH:
print 'USING DEFAULT'
else:
print 'USING EXPLICIT'

print args.path

if __name__ == '__main__':
main()

请注意,我实际上并不认为这是个好主意。

关于python - 我可以检查一个值是默认提供的还是用户提供的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30678187/

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