如何创建参数解析

2024-05-02 01:50:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我对python中的argparser是新手。我正在尝试为文件创建argparser,该文件包含两个函数downloaduploadfile on/from box。它一次只执行一个功能,因为我正在尝试为该文件创建解析器,如下所示,但对我无效:

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'


Tags: toboxaddtrueparserdfondownload
3条回答

我建议您去掉这些争论中的大部分,也许全部,考虑一下标准的Unix方式。你知道吗

以scp为例,它的语法为:scpsource destination

例如:scp下载/boxfile/xyz.txt文件qwe.txt文件你知道吗

如果您不提供目的地,则会推断出您希望该文件被称为同一个对象,并正好位于此处,因此这两个对象是等价的:

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

当然,scp可以通过互联网与机器对话,因此有一种格式:

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子parser。一个upload有自己的论点。你知道吗

另一个选项是设置-df接受2个参数(nargs=2),包括它的box和它的file。你知道吗

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

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

例如

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

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

关于风格的问题。带有on-的短选项标志通常是单个字符。-d-u等。只有在这种情况下,才能将多个字符串组合成一个字符串,例如-df foo。在这种情况下,这可能无关紧要,因为您的参数都不是store_true。你知道吗

我对argparse不太熟悉,但是通过阅读文档,我认为没有办法使用mutually_exclusive_grouprequired来强制实现这一点。似乎有必要使用条件语句或等效语句来确认是否传递了有效的参数组合。你知道吗

见:Python Argparse conditionally required arguments

相关问题 更多 >