从optparse传递可选参数

时间:2012-07-26 01:51:44

标签: python python-2.6 optparse optional-arguments

我正在试图弄清楚如何从optparse传递可选参数。我遇到的问题是如果没有指定optparse选项,它默认为None类型,但如果我将None类型传递给函数,它会对我大喊大叫,而不是使用默认值(这是可以理解和有效的)。

conn = psycopg2.connect(database=options.db, hostname=options.hostname, port=options.port)

问题是,如何使用函数的默认值作为可选参数,但如果输入没有大量的if语句,仍会传入用户输入。

2 个答案:

答案 0 :(得分:2)

定义一个函数remove_none_values,用于过滤无值参数的字典。

def remove_none_values(d):
    return dict((k,v) for (k,v) in d.iteritems() if not v is None)

kwargs = {
  'database': options.db,
  'hostname': options.hostname,
  ...
}
conn = psycopg2.connect(**remove_none_values(kwargs))

或者,定义一个函数包装器,在将数据传递给原始函数之前不删除任何值。

def ignore_none_valued_kwargs(f):
    @functools.wraps(f)
    def wrapper(*args, **kwargs):
        newkwargs = dict((k,v) for (k,v) in d.iteritems() if not v is None)
        return f(*args, **kwargs)
    return wrapper

my_connect = ignore_none_valued_kwargs(psycopg2)
conn = my_connect(database=options.db, hostname=options.hostname, port=options.port)

答案 1 :(得分:0)

我的opo包裹thebops模块pip install thebopshttps://bitbucket.org/therp/thebops)包含add_optval_option功能。 这使用了一个额外的关键字参数empty,它指定在没有值的情况下使用该选项时要使用的值。如果在命令行中找到其中一个选项字符串,则将此值注入参数列表。

这仍然是hackish,但至少它是一个简单易用的功能......

在以下情况下效果很好:

  • 创建选项时,参数向量已存在。这通常是正确的。
  • 我发现所有带有可选值的运动参数的程序都要求将给定的值附加为--option=value-ovalue而不是--option value或{{1 }}。

也许我会调整-o value以支持thebops.optparse参数;但是我想先建立一个测试套件来防止回归,最好是原来的empty / Optik测试。

这是代码:

optparse