python-3.x 带有多个标志和参数的argparse

hrirmatl  于 2023-10-21  发布在  Python
关注(0)|答案(2)|浏览(111)

我希望我的代码能够根据标志调用不同的函数,然后使用在标志之后传递的参数作为函数的输入。
预期输出示例:

$ python3 test.py -a 2
4

$ python3 test.py -a human123
<Error message>

$ python3 test.py -h human123
Hello, human123

下面是我的示例代码:

class Test:
    def __init__(self):
        pass
    
    def add(self, a):
        return a+a

    def hello(self, name):
        return f"Hello, {name}"

parser = argparse.ArgumentParser()

parser.add_argument('-a', '--add', dest='command', action='store_consts', const='add', nargs=1, help='add a to itself')
parser.add_argument('-h', '--hello', dest='command', action='store_consts', const='hello', nargs=1, help='hello!')

args = parser.parse_args()
t = Test()

if args.command=='add':
    print(t.add(args.add))
elif args.command=='sub':
    print(t.hello(args.hello))

这个示例代码目前正在做我想实现的事情。我尝试了很多方法来解决这个问题,从删除“const”,将action改为“store”,将nargs的值改为“?'等,但是,它不断给我不同类型的错误,如TypeError等。

l0oc07j2

l0oc07j21#

简化你的论点:

import argparse

class Test:
    def __init__(self):
        pass
    
    def add(self, a):
        return a+a

    def hello(self, name):
        return f"Hello, {name}"

parser = argparse.ArgumentParser()

parser.add_argument('-a', '--add', help='add a to itself')
parser.add_argument('-b', '--hello', help='hello!')         # -h is already taken

args = parser.parse_args()
print(args)
t = Test()

if args.add:                # or 'args.add is not None:'
    print(t.add(args.add))
elif args.hello:
    print(t.hello(args.hello))

测试运行:

1936:~/mypy$ python3 stack62702524.py -a testing
Namespace(add='testing', hello=None)
testingtesting
1937:~/mypy$ python3 stack62702524.py -b other
Namespace(add=None, hello='other')
Hello, other
1937:~/mypy$ python3 stack62702524.py 
Namespace(add=None, hello=None)

===
你的错误,你没有显示:{当你得到错误,不要只是扔你的手,并随机尝试替代品。阅读文档并尝试理解错误。

parser.add_argument('-c', action='store_consts', const='hello')
ValueError: unknown action "store_consts"

parser.add_argument('-c', action='store_const', const='hello', nargs=1)
TypeError: __init__() got an unexpected keyword argument 'nargs'

'store_consts'是一个名称错误;对于'store_const',nargs固定为0;这是无法改变的
如果我添加3个参数-两个store_const和一个位置:

parser.add_argument('-c', dest='command', action='store_const', const='add')
parser.add_argument('-d', dest='command', action='store_const', const='hello')
parser.add_argument('foo')

请注意两个新的commandfoo属性,您可以在函数调用中使用它们:

1945:~/mypy$ python3 stack62702524.py -c bar
Namespace(add=None, command='add', foo='bar', hello=None)
1945:~/mypy$ python3 stack62702524.py -d bar
Namespace(add=None, command='hello', foo='bar', hello=None)
pw9qyyiw

pw9qyyiw2#

通常我使用add_argumentdest参数来指定变量名。
举例来说:

parser.add_argument("-a", "--add", dest="add", required=False, type=str help="some help")

可通过以下方式访问:

args = parser.parse_args()
print(args.add == "something")

我相信每个参数需要一个唯一的dest
另外,-h保留用于帮助。您可能希望将其更改为-e或其他内容。

parser.add_argument('-h', '--hello', ...)

相关问题