【问题标题】:Python optparse callback giving arguments to functionPython optparse 回调为函数提供参数
【发布时间】:2013-09-18 23:08:50
【问题描述】:

我在使用回调时为函数提供参数时遇到问题。我是 python 中命令行参数脚本的新手,所以对我来说轻松一点。这是我的代码:

    from optparse import OptionParser
    import urllib

    def google(option, opt_str, value, parser):
        print options.f_name

    parser = OptionParser()
    parser.add_option("-f", "--first", type="string", dest="f_name", help="Supply a first name to search", action="store")
    parser.add_option("-l", "--last", type="string", dest="l_name", help="Supply a last name to search", action="store")
    parser.add_option("-g", "--google", action="callback", callback=google)

    (options, args) = parser.parse_args()

而且似乎无法弄清楚为什么它不会打印出用户提供的输入。我在 optparse 上查看了 python 的文档,它变得模糊了。无论如何,我可以在该函数中使用 options.f_name 的任何可能方式。我一直在使用类似的东西来放入要使用的函数参数。

    first_name = options.f_name

然后会为函数提供一个也不起作用的参数。

【问题讨论】:

标签: python callback optparse


【解决方案1】:

旧帖子,但为了后代: 您需要指定参数的type,以便让optparse 将其注入value 参数:

def google(option, opt_str, value, parser):
    print value
parser.add_option("-g", "--google", action="callback", callback=google, type="string")

展示如何将值返回到解析器以包含在options 中的完整示例:

from optparse import OptionParser

def doSomethingWithValue(value):
    return "baked beans and {}".format(value)

def google(option, opt_str, value, parser):
    setattr(parser.values, option.dest, doSomethingWithValue(value))

parser = OptionParser()
parser.add_option("-g", "--google", action="callback", callback=google, type="string", dest="googleOption")
(options, args) = parser.parse_args()
print(options)

# ./script.py          ==> {'googleOption': None}
# ./script.py -g spam  ==> {'googleOption': 'baked beans and spam'}

【讨论】:

    【解决方案2】:

    optparse 很难使用。你应该试试docopt。 http://docopt.org/

    附带说明,urllib 也很难使用。查看请求模块。 http://docs.python-requests.org/en/latest/

    【讨论】:

      【解决方案3】:

      未指定参数的评估顺序,因此可以在 optparse 处理 -f 选项之前调用 -g 的回调。在解析期间执行此操作的唯一方法是使它们都成为相互了解的回调,并且只有在处理第二个参数时,它才会执行您正在寻找的行为。 有什么理由不能在parse_args() 完成后设置一个标志并处理它,那么您将确定所有参数都已处理。

      顺便说一句:不推荐使用 optparse 来支持 argparse。

      【讨论】:

        【解决方案4】:

        如果你查看documentation,你会发现你确实需要使用:

        parser.values.f_name
        

        当然你应该确保你对hasn't been defined yet的情况采取了预防措施。

        【讨论】:

          猜你喜欢
          • 2022-11-19
          • 2018-05-15
          • 2019-03-27
          • 1970-01-01
          • 2012-02-03
          • 2018-07-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多