Python's argparse: How to use keyword as argum

2019-02-21 19:45发布

lambda has a keyword function in Python:

f = lambda x: x**2 + 2*x - 5

What if I want to use it as a variable name? Is there an escape sequence or another way?

You may ask why I don't use another name. This is because I'd like to use 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!

Script called with --help option gives:

...
optional arguments
  -h, --help            show this help message and exit
  -l LAMBDA, --lambda LAMBDA
                        Defines the quantity called lambda

Because of that, I would like to stay with lambda as the variable name. Solutions may be argparse-related as well.

3条回答
\"骚年 ilove
2楼-- · 2019-02-21 20:26

argparse provides destination functionality for arguments if the long option name is not the desired attribute name for the argument.

For instance:

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

args = parser.parse_args()

print(args.function)
查看更多
3楼-- · 2019-02-21 20:31

You can use dynamic attribute access to access that specific attribute still:

print getattr(args, 'lambda')

Better still, tell argparse to use a different attribute name:

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

Here the dest argument tells argparse to use lambda_ as the attribute name:

print args.lambda_

The help text still will show the argument as --lambda, of course; I set metavar explicitly as it otherwise would use dest in uppercase (so with the underscore):

>>> 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
查看更多
姐就是有狂的资本
4楼-- · 2019-02-21 20:37

There is an argparse-specific way of dealing with this. From the documentation:

If you prefer to have dict-like view of the attributes, you can use the standard Python idiom, vars().

Therefore, you should be able to write:

print vars(args)["lambda"]  # No keyword used, no syntax error.
查看更多
登录 后发表回答