如何将Python关键字用作argparse的参数名称?

17

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相关。


1
将其命名为“Lambda”而不是“lambda”? - jrjc
...或者将其命名为_lambdalambda_ - martineau
3个回答

33
你可以使用动态属性访问仍然访问该特定属性:
print getattr(args, 'lambda')

更好的是,告诉argparse使用不同的属性名称:
parser.add_argument("-l", "--lambda",
    help="Defines the quantity called lambda",
    type=float, dest='lambda_', metavar='LAMBDA')

在这里,dest参数告诉argparselambda_用作属性名称:

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

dest 解决方案不能用于位置参数。 - unndreay
@unndreay:这是因为对于位置参数,名称就是“dest”参数。使用“metavar”提供一个字符串,在那里使用帮助文本。parser.add_argument('lambda_', metavar='lambda') - Martijn Pieters
抱歉,我并不是在抱怨,只是有所注意。 - unndreay
我并没有把它当作抱怨。 :-) - Martijn Pieters

4

有一种特定于argparse的处理方式。来自文档:

如果您希望以类似字典的视图查看属性,可以使用标准的Python习惯用法,vars()

因此,您应该能够编写:

print vars(args)["lambda"]  # No keyword used, no syntax error.

2

argparse 提供了目标功能,如果长选项名称不是参数的期望属性名称,则可以使用该功能。

例如:

parser = argparse.ArgumentParser()
parser.add_argument("--lambda", dest="function")

args = parser.parse_args()

print(args.function)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接