如何在argparse中使用Python关键字作为参数名?
lambda
在Python中是一个关键字,用来定义匿名函数:
f = lambda x: x**2 + 2*x - 5
如果我想把它当作变量名使用,有没有什么方法可以解决这个问题?
你可能会问,为什么不换个名字呢?这是因为我想使用argparse
这个库:
parser = argparse.ArgumentParser("Calculate something with a quantity commonly called lambda.")
parser.add_argument("-l","--lambda",help="Defines the quantity called lambda", type=float)
args = parser.parse_args()
print args.lambda # syntax error!
当脚本使用--help
选项调用时,会显示:
...
optional arguments
-h, --help show this help message and exit
-l LAMBDA, --lambda LAMBDA
Defines the quantity called lambda
因此,我希望能继续用lambda
作为变量名。解决方案可能也和argparse
有关。
3 个回答
2
argparse
是一个用来处理命令行参数的工具,它可以让你为参数指定一个不同的名字,这样即使你在命令行中使用的长选项名称不是你想要的属性名称,也没关系。
举个例子:
parser = argparse.ArgumentParser()
parser.add_argument("--lambda", dest="function")
args = parser.parse_args()
print(args.function)
4
有一种专门针对argparse的处理方法。来自文档的说明:
如果你更喜欢以字典的方式查看属性,可以使用标准的Python写法,
vars()
。
所以,你应该可以这样写:
print vars(args)["lambda"] # No keyword used, no syntax error.
33
你可以使用动态属性访问来访问那个特定的属性:
print getattr(args, 'lambda')
更好的方法是告诉 argparse
使用一个不同的属性名称:
parser.add_argument("-l", "--lambda",
help="Defines the quantity called lambda",
type=float, dest='lambda_', metavar='LAMBDA')
这里的 dest
参数 告诉 argparse
使用 lambda_
作为属性名称:
print args.lambda_
当然,帮助文本仍然会显示这个参数为 --lambda
; 我明确设置了 metavar
,因为如果不设置,它会使用大写的 dest
(也就是带下划线的形式):
>>> import argparse
>>> parser = argparse.ArgumentParser("Calculate something with a quantity commonly called lambda.")
>>> parser.add_argument("-l", "--lambda",
... help="Defines the quantity called lambda",
... type=float, dest='lambda_', metavar='LAMBDA')
_StoreAction(option_strings=['-l', '--lambda'], dest='lambda_', nargs=None, const=None, default=None, type=<type 'float'>, choices=None, help='Defines the quantity called lambda', metavar='LAMBDA')
>>> parser.print_help()
usage: Calculate something with a quantity commonly called lambda.
[-h] [-l LAMBDA]
optional arguments:
-h, --help show this help message and exit
-l LAMBDA, --lambda LAMBDA
Defines the quantity called lambda
>>> args = parser.parse_args(['--lambda', '4.2'])
>>> args.lambda_
4.2