gpt4 book ai didi

python - Argparse 默认为函数始终被调用

转载 作者:行者123 更新时间:2023-12-01 01:48:36 26 4
gpt4 key购买 nike

//编辑1:略有改变get_variable - 忘记添加另一个传递给它的参数(是凭内存写的,对此感到抱歉)。

我对default有疑问值来自argparser .

如果命令行中不存在某些值,则使用 os.env 从环境中获取,如果没有,请从 DEFAULT_FOR_VARIABLE 获取:

def get_variable(name, DEFAULT_FOR_VARIABLE = ''):
if name in os.environ:
return os.environ[name]
print("no default value")
return DEFAULT_FOR_VARIABLE

这就是 main() 中的解析方式:

parser = argparse.ArgumentParser(description=MODULE_NAME)
parser.add_argument('--test_arg', default=get_variable(VAR_NAME, DEFAULT_FOR_TEST_ARG))
args = parser.parse_args()
print(args.test_arg)

无论我是否传递参数,get_variable如果 os.environ 中没有值,则调用函数, print即使传递了一个值,也会被执行(让我知道缺少参数):

λ python Parser_Test.py --test_arg test_arg
no default value
test_arg

当参数未传递时,它会按预期工作:

λ python Parser_Test.py
No default value

但是什么时候DEFAULT_FOR_TEST_ARG设置为:

λ python Parser_Test.py
No default value
DEFAULT_VALUE_FOR_TEST_ARG

检查每个已解析的参数也很困难,因为无法按照 argparse 提供的方式迭代它们。 - 我需要从用户那里检查的内容很少。

有办法改变这种行为吗?或者在这种情况下我应该使用非标准模块来解析参数?

最佳答案

当使用 add_argument 方法时,解释器会计算

get_variable(VAR_NAME) 。在 python 中,函数参数在传递给函数之前会被评估。

argparse 如果默认值是字符串,则会延迟计算:

In [271]: p = argparse.ArgumentParser()
In [272]: p.add_argument('-f', type=int, default='12');
In [273]: p.parse_args('-f 23'.split())
Out[273]: Namespace(f=23)
In [274]: p.parse_args([])
Out[274]: Namespace(f=12)

这里,如果没有提供-f'12'将被传递给type函数:

int('12')

或使用自定义类型:

In [275]: def mytype(astr):
...: print('eval',astr)
...: return int(astr)
In [276]: p.add_argument('-g', type=mytype, default='12');
In [277]: p.parse_args([])
eval 12
Out[277]: Namespace(f=12, g=12)
In [278]: p.parse_args(['-g','3'])
eval 3
Out[278]: Namespace(f=12, g=3)

但在您的情况下,您想要有条件评估的代码可能无法由 type 函数处理。也就是说,您不会以与用户提供的字符串相同的方式评估默认值。

因此解析后测试可能最有意义。默认值是None,很容易测试:

if args.test is None:
args.test = 'the proper default'

用户无法提供任何会产生 None 的字符串,因此它是安全的默认

<小时/>

出于好奇,我编写了一个 type 来在 os.environ 中查找名称:

In [282]: def get_environ(name):
...: if name in os.environ:
...: return os.environ[name]
...: raise argparse.ArgumentTypeError('%s not in environ'%name)

In [283]: p.add_argument('-e', type=get_environ, default='DISPLAY');

如果没有参数,它会查找默认的os.environ['DISPLAY']

In [284]: p.parse_args([])
eval 12
Out[284]: Namespace(e=':0', f=12, g=12)

具有有效名称:

In [289]: p.parse_args(['-e','EDITOR'])
eval 12
Out[289]: Namespace(e='nano', f=12, g=12)

当名称无效时会引发错误:

In [290]: p.parse_args(['-e','FOO'])
usage: ipython3 [-h] [-f F] [-g G] [-e E]
ipython3: error: argument -e: FOO not in environ
An exception has occurred, use %tb to see the full traceback.

我知道这不是您的目标,但它给出了如果您想延迟默认评估可能发生的情况的想法。

关于python - Argparse 默认为函数始终被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50967625/

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