我正在试图弄清楚如何从optparse传递可选参数。我遇到的问题是如果没有指定optparse选项,它默认为None类型,但如果我将None类型传递给函数,它会对我大喊大叫,而不是使用默认值(这是可以理解和有效的)。
conn = psycopg2.connect(database=options.db, hostname=options.hostname, port=options.port)
问题是,如何使用函数的默认值作为可选参数,但如果输入没有大量的if语句,仍会传入用户输入。
答案 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 thebops
,https://bitbucket.org/therp/thebops)包含add_optval_option
功能。
这使用了一个额外的关键字参数empty
,它指定在没有值的情况下使用该选项时要使用的值。如果在命令行中找到其中一个选项字符串,则将此值注入参数列表。
这仍然是hackish,但至少它是一个简单易用的功能......
在以下情况下效果很好:
--option=value
或-ovalue
而不是--option value
或{{1 }}。也许我会调整-o value
以支持thebops.optparse
参数;但是我想先建立一个测试套件来防止回归,最好是原来的empty
/ Optik
测试。
这是代码:
optparse