我对python中的argparser
是新手。我正在尝试为文件创建argparser
,该文件包含两个函数download
和upload
file 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'
我建议您去掉这些争论中的大部分,也许全部,考虑一下标准的Unix方式。你知道吗
以scp为例,它的语法为:scpsource destination
例如:scp下载/boxfile/xyz.txt文件qwe.txt文件你知道吗
如果您不提供目的地,则会推断出您希望该文件被称为同一个对象,并正好位于此处,因此这两个对象是等价的:
当然,scp可以通过互联网与机器对话,因此有一种格式:
如果要上传,只需切换顺序:
如前所述,所有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
为您实现更容易。你知道吗例如
为可选参数提供默认值也是一个好主意。这样,即使用户没有提供所有项,代码也可以运行。你知道吗
关于风格的问题。带有on
-
的短选项标志通常是单个字符。-d
、-u
等。只有在这种情况下,才能将多个字符串组合成一个字符串,例如-df foo
。在这种情况下,这可能无关紧要,因为您的参数都不是store_true
。你知道吗我对argparse不太熟悉,但是通过阅读文档,我认为没有办法使用
mutually_exclusive_group
和required
来强制实现这一点。似乎有必要使用条件语句或等效语句来确认是否传递了有效的参数组合。你知道吗见:Python Argparse conditionally required arguments
相关问题 更多 >
编程相关推荐