Python optparse 默认值与函数默认值

发布于 2024-08-06 01:36:30 字数 557 浏览 2 评论 0原文

我正在编写一个 python 脚本,我希望能够从命令行调用它并作为库函数导入。 理想情况下,命令行选项和函数应使用同一组默认值。 允许我在两个地方重用一组默认值的最佳方法是什么?

这是具有重复默认值的当前代码。

from optparse import OptionParser

def do_stuff(opt1="a", opt2="b", opt3="c"):
    print opt1, opt2, opt3

if __name__ == "__main__":
    parser = OptionParser()
    parser.add_option("--opt1", default="a")
    parser.add_option("--opt2", default="b")
    parser.add_option("--opt3", default="c")
    #parser.set_defaults(opt1="a")

    options, args = parser.parse_args()

    do_stuff(*args, **vars(options))

I'm writing a python script which I would like to be able to both call from the command line and import as a library function.
Ideally the command line options and the function should use the same set of default values.
What is the best way to allow me to reuse a single set of defaults in both places?

Here's the current code with duplicate defaults.

from optparse import OptionParser

def do_stuff(opt1="a", opt2="b", opt3="c"):
    print opt1, opt2, opt3

if __name__ == "__main__":
    parser = OptionParser()
    parser.add_option("--opt1", default="a")
    parser.add_option("--opt2", default="b")
    parser.add_option("--opt3", default="c")
    #parser.set_defaults(opt1="a")

    options, args = parser.parse_args()

    do_stuff(*args, **vars(options))

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

未蓝澄海的烟 2024-08-13 01:36:30

我会通过内省感兴趣的函数来适当地设置选项和默认值来处理它。例如:

import inspect
from optparse import OptionParser
import sys

def do_stuff(opt0, opt1="a", opt2="b", opt3="c"):
    print opt0, opt1, opt2, opt3

if __name__ == "__main__":
    parser = OptionParser()
    args, varargs, varkw, defaults = inspect.getargspec(do_stuff)
    if varargs or varkw:
      sys.exit("Sorry, can't make opts from a function with *a and/or **k!")
    lend = len(defaults)
    nodef = args[:-lend]
    for a in nodef:
      parser.add_option("--%s" % a)
    for a, d in zip(args[-lend:], defaults):
      parser.add_option("--%s" % a, default=d)

    options, args = parser.parse_args()
    d = vars(options)
    for n, v in zip(nodef, args):
      d[n] = v

    do_stuff(**d)

I'd handle it by introspecting the function of interest to set options and defaults appropriately. For example:

import inspect
from optparse import OptionParser
import sys

def do_stuff(opt0, opt1="a", opt2="b", opt3="c"):
    print opt0, opt1, opt2, opt3

if __name__ == "__main__":
    parser = OptionParser()
    args, varargs, varkw, defaults = inspect.getargspec(do_stuff)
    if varargs or varkw:
      sys.exit("Sorry, can't make opts from a function with *a and/or **k!")
    lend = len(defaults)
    nodef = args[:-lend]
    for a in nodef:
      parser.add_option("--%s" % a)
    for a, d in zip(args[-lend:], defaults):
      parser.add_option("--%s" % a, default=d)

    options, args = parser.parse_args()
    d = vars(options)
    for n, v in zip(nodef, args):
      d[n] = v

    do_stuff(**d)
Bonjour°[大白 2024-08-13 01:36:30

这是解决方案 - 如果您只需要关键字参数,那么这很简单 - 只需使用 locals.update 即可。以下处理位置参数和关键字参数(关键字参数覆盖位置参数)。

from optparse import OptionParser

ARGS = {'opt1': 'a', 
        'opt2': 'b',
        'opt3': 'c'}

def do_stuff(*args, **kwargs):
    locals = ARGS

    keys = ARGS.keys()
    keys.sort()

    if args:
        for key,arg in zip(keys,args):
            locals.update({key: arg})
    if kwargs:
        locals.update(kwargs)

    print locals['opt1'], locals['opt2'], locals['opt3']

if __name__ == "__main__":
    parser = OptionParser()
    for key,default in ARGS.items():
        parser.add_option('--%s' % key, default='%s' % default)

    options, args = parser.parse_args()

    do_stuff(*args, **vars(options))
    do_stuff()
    do_stuff('d','e','f')
    do_stuff('d','e','f', opt3='b')
    do_stuff(opt1='c', opt2='a', opt3='b')

输出:

a b c 
a b c 
d e f 
d e b 
c a b 

Here's the solution - it's trivial if you only need keyword arguments - just use locals.update. Following handles both, positional and key word args (key word args overrides positional).

from optparse import OptionParser

ARGS = {'opt1': 'a', 
        'opt2': 'b',
        'opt3': 'c'}

def do_stuff(*args, **kwargs):
    locals = ARGS

    keys = ARGS.keys()
    keys.sort()

    if args:
        for key,arg in zip(keys,args):
            locals.update({key: arg})
    if kwargs:
        locals.update(kwargs)

    print locals['opt1'], locals['opt2'], locals['opt3']

if __name__ == "__main__":
    parser = OptionParser()
    for key,default in ARGS.items():
        parser.add_option('--%s' % key, default='%s' % default)

    options, args = parser.parse_args()

    do_stuff(*args, **vars(options))
    do_stuff()
    do_stuff('d','e','f')
    do_stuff('d','e','f', opt3='b')
    do_stuff(opt1='c', opt2='a', opt3='b')

Output:

a b c 
a b c 
d e f 
d e b 
c a b 
水波映月 2024-08-13 01:36:30

Alex 的检查解决方案非常强大!

对于轻量级程序,您也可以简单地使用:

def do_stuff(opt1="a", opt2="b", opt3="c"):
    print opt1, opt2, opt3

if __name__ == "__main__":
    from optparse import OptionParser
    opts = do_stuff.func_defaults
    parser = OptionParser()    
    parser.add_option("--opt1", default=opts[0], help="Option 1 (%default)")
    parser.add_option("--opt2", default=opts[1], help="Option 2 (%default)")
    parser.add_option("--opt3", default=opts[2], help="Option 3 (%default)")

    options, args = parser.parse_args()

    do_stuff(*args, **vars(options))

The inspect solution by Alex is very powerful!

For lightweight programs, you could also simply use this:

def do_stuff(opt1="a", opt2="b", opt3="c"):
    print opt1, opt2, opt3

if __name__ == "__main__":
    from optparse import OptionParser
    opts = do_stuff.func_defaults
    parser = OptionParser()    
    parser.add_option("--opt1", default=opts[0], help="Option 1 (%default)")
    parser.add_option("--opt2", default=opts[1], help="Option 2 (%default)")
    parser.add_option("--opt3", default=opts[2], help="Option 3 (%default)")

    options, args = parser.parse_args()

    do_stuff(*args, **vars(options))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文