【问题标题】:Python's argparse: How to use keyword as argument's namePython argparse:如何使用关键字作为参数名称
【发布时间】:2014-08-04 12:17:52
【问题描述】:

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

【问题讨论】:

  • 将其命名为 Lambda 而不是 lambda?
  • ...或将其命名为 _lambdalambda_

标签: python lambda argparse


【解决方案1】:

您仍然可以使用动态属性访问来访问该特定属性:

print getattr(args, 'lambda')

更好的是,告诉argparse 使用不同的属性名称:

parser.add_argument("-l", "--lambda",
    help="Defines the quantity called lambda",
    type=float, dest='lambda_', metavar='LAMBDA')

这里的dest argument 告诉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

【讨论】:

  • dest 解决方案不适用于位置参数。
  • @unndreay:这是因为对于位置参数,名称 dest 参数。使用metavar 提供一个字符串以在帮助文本中使用。 parser.add_argument('lambda_', metavar='lambda').
  • 对不起,不想抱怨。刚刚注意到。
  • 我没有把它当成抱怨。 :-)
【解决方案2】:

有一个 argparse-specific 处理这个的方法。来自documentation

如果您更喜欢 dict 般的属性视图,您可以使用 标准的 Python 习语,vars()

因此,你应该可以写:

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

【讨论】:

    【解决方案3】:

    argparse 如果长选项名称不是参数所需的属性名称,则为参数提供目标功能。

    例如:

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

    【讨论】:

      猜你喜欢
      • 2016-03-26
      • 1970-01-01
      • 2023-02-06
      • 1970-01-01
      • 2013-03-20
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      • 2017-12-05
      相关资源
      最近更新 更多