用于组合其他选项的Argparse快捷方式选项

时间:2016-06-25 02:56:03

标签: python argparse

假设我有输入文件选项和输出文件选项。如何创建一个结合两者的选项?例如:

$ ./my_script.py -i input.txt -o output.txt

可以合并为:

$ ./my_script.py --io input_output.txt

您可以说我可以-io组合两个选项,但-io filename-i -o filename的快捷方式,而不是-i filename -o filename

我认为可以在我的dest=('input', 'output')调用中添加.add_argument(),但这会引发dest必须是字符串的错误。

我尝试在一侧添加一个互斥的组--io,另一侧添加一组-i-o,但-i-o的帮助文本当程序与--help一起运行时,usage: myscript.py [-h] [--io] [-i INPUT] [-o OUTPUT] optional arguments: -h, --help show this help message and exit --io Use file as both input and output 不再显示:

--io

此外,相互排斥的部分似乎不起作用。我仍然可以使用-i和单独的-oimport argparse parser = argparse.ArgumentParser() parser.add_argument("-i", "--input", help="Input file") parser.add_argument("-o", "--output", help="Output file") parser.parse_args() 选项调用脚本,并且不会出现错误。

这是我的骨架代码:

import argparse

parser = argparse.ArgumentParser()

exclusive = parser.add_mutually_exclusive_group()
exclusive.add_argument("--io", help="Input and Output")

sub = exclusive.add_argument_group()
sub.add_argument("-i", "--input", help="Input file")
sub.add_argument("-o", "--output", help="Output file")

args = parser.parse_args()

if args.io:
    in_file = out_file = args.io
else:
    in_file = args.input
    out_file = args.output

包含代码的代码:

package Database;
import java.sql.*;

public class Database {

 public static void main(String[] args) {
    final  String URl = "JDBC:mysql:/localhost:3306/info";
    final  String id = "root";
    final  String  password = "";

    try
    {
        Connection con1 = DriverManager.getConnection(URl,id,password);
        Statement s1 = con1.createStatement();
        String s = "CREATE DATABASE CLASSIFIED";
        s1.executeUpdate(s);

    }
    catch(SQLException err)
    {
        System.out.println(err.getMessage());
    }

 }

}

2 个答案:

答案 0 :(得分:2)

更容易解释为什么事情不起作用而不是建议解决方案。

是的,dest必须是字符串;没有提供dest值的列表或元组。但是你的in_file = out_file = args.io地址发布得很好。你也可以使用:

 args.in_file=args.out_file = args.io

解析后按摩args值没有任何问题。

argument_group不是为嵌套而设计的,也不是将{any'(或'和')逻辑添加到mutually_exclusive_group的方法。也许在遥远的未来,将有一种方法来定义一整套逻辑组合,但现在不是。实际上进行测试并不困难;很难定义API和使用格式。

另请注意,mutually_exclusive_group用于格式化参数的co_ocurrance的使用和测试,而argument_group用于对参数帮助行进行分组。两个非常不同的目的。

如果-istore_true参数,则-io filename将被理解为-i -o filename。但是,-i filename -o filename的翻译不在当前代码中(并且可能不足以保证补丁)。

如果您仍想使用-i-o--io(我更喜欢-- 2个字符标记),我可以提出以下几点建议:

  • 编写一个自定义用法,演示您想要的内容。如果很难写清楚用法,那么你的设计可能太复杂了。

  • 解析后进行自己的exclusive groups测试。 args.in_file is None是测试是否使用过标记的好方法。另一种可能性是定义默认值,以便您不关心用户使用哪种组合。

答案 1 :(得分:0)

保持简单 - 无论如何,您展示的独家群组代码并未排除使用这两种形式。试试这个:

import argparse

parser = argparse.ArgumentParser()

parser.add_argument("-i", "--input", help="Input file")
parser.add_argument("-o", "--output", help="Output file")
parser.add_argument("--io", help="Input and Output")

parser.parse_args()

if args.io:
    assert args.input is None and args.output is None
    args.input = args.output = args.io
else:
    assert args.input and args.output