如何创建参数解析器

How to create Argument Parser

我是 python 中 argparser 的新手。我正在尝试为包含两个函数 downloadupload 文件 on/from 框的文件创建 argparser。根据我正在尝试为该文件创建解析器如下所示,它一次只会执行一项功能,但它对我不起作用:

parser = argparse.ArgumentParser(description='Download or Upload file on box.')
    parser.add_argument('-df', '--download', required=True,
                        help='download file box')
    parser.add_argument('-uf', '--upload', nargs='+', required=True,
                        help='upload file of box')
    parser.add_argument('-fp', '--filepath', required=True,
                        help='file path to upload(which file to upload) or download(where to download file)')
    parser.add_argument('-fn', '--filename', required=True,
                        help='what should be the name of file on box')
    parser.add_argument('-fi', '--fileid', required=True,
                        help='file id of file to download from box')

    args = vars(parser.parse_args())

注意 :- 每次只有 -df-uf 选项会出现, -fp 对两者都是必需的,如果它是-df 那么 -fi 是唯一的选项,它是强制性的,如果 -uf 那么 -fn 是唯一的选项,它是强制性的。

我如何实现这一点,以下是我如何将参数传递给文件的示例

pyhton abc.py -df -fp 'Download/boxfile/xyz.txt' -fi 123

python abc.py -uf -fp 'Download/boxfile/xyz.txt' -fn 'qwe.txt'

我对 argparse 不是很熟悉,但是通过阅读文档,我认为没有办法使用 mutually_exclusive_grouprequired 来强制执行此操作。似乎需要条件语句或等效语句来确认传递了有效的参数组合。

参见:Python Argparse conditionally required arguments

我建议您摆脱大部分这些争论,也许是全部,并考虑标准的 Unix 做事方式。

考虑 scp,其语法为:scp source destination

例如:scp Download/boxfile/xyz.txt qwe.txt

如果你不提供目的地,它会推断你希望文件被称为相同的东西,并降落在这里,所以这两个东西是等价的:

scp Download/boxfile/xyz.txt xyz.txt
scp Download/boxfile/xyz.txt

当然,scp 可以通过 Internet 与机器通信,因此有一种格式:

scp hostname:Download/boxfile/xyz.txt xyz.txt

如果您正在上传,只需切换顺序即可:

scp xyz.txt hostname:Download/boxfile/xyz.txt

正如所写,所有 5 个论点都是 required - 你说得很明确。如果那是您真正想要的,那么其余所有问题都无关紧要。无论如何,您都必须提供全部 5 个。

但评论表明您想要使用 -df-uf,但可能不会同时使用这两者(虽然不清楚)。

虽然 argparse 中有 mutually_exclusive_mechanism,但没有 inclusive 等价物 - 如果 -f 存在,则 -g 也必须给出。

但是subparsers机制可以这样使用。您可以使用必需的 -fi 参数定义 download 子解析器。还有一个 upload 有自己的参数。

另一种选择是设置 -df 接受 2 个参数 (nargs=2),它的 boxfile.

如果-df-uf互斥,为什么不对文件名使用相同的参数?也就是说,将 -fn-fi 替换为一个 file 参数。

另一种选择是使所有(或大部分)参数都不是必需的,并在解析后检查正确的组合。在您自己的代码中实现复杂的逻辑比强制 argparse 为您做更容易。

例如

 if args.download is not None:    # not default
     <check for `args.filename`> etc

为可选参数提供默认值也是一个好主意。这样,即使用户没有提供所有项目,代码也可以 运行。

关于风格问题。带有 - 的短选项标志通常是单个字符。 -d-u 等。将多个字符串组合成一个字符串的能力仅在这种情况下有效,例如-df foo。在这种情况下,这可能无关紧要,因为您的参数 none 是 store_true.