getopts Values 类和 Template.Substitute 不能(立即)一起工作

发布于 2024-07-19 07:53:05 字数 622 浏览 10 评论 0原文

我有类似的 python 代码:

from string import Template
import optparse

def main():
  usage = "usage: %prog options outputname"
  p = optparse.OptionParser(usage)
  p.add_option('--optiona', '-a', default="")
  p.add_option('--optionb', '-b', default="")
  options, arguments = p.parse_args()
  t = Template('Option a is ${optiona} option b is ${optionb}')
  print t.substitute(options)

但这给了我

AttributeError: Values instance has no attribute '__getitem__'

因为 options 是一个值而不是字典。

我如何巧妙地完成这项工作?

(欢迎任何其他建议,我的Python意识仍在培养中......)

I have python code something like:

from string import Template
import optparse

def main():
  usage = "usage: %prog options outputname"
  p = optparse.OptionParser(usage)
  p.add_option('--optiona', '-a', default="")
  p.add_option('--optionb', '-b', default="")
  options, arguments = p.parse_args()
  t = Template('Option a is ${optiona} option b is ${optionb}')
  print t.substitute(options)

But that gives me

AttributeError: Values instance has no attribute '__getitem__'

Because options is a Values and not a dictionary.

How do I neatly make this work?

(any other suggestions welcome, my pythonic sense is still being nurtured...)

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

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

发布评论

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

评论(2

分开我的手 2024-07-26 07:53:05

OptionParser.parse_args 返回一个对象,其中选项变量名称作为属性,而不是字典键。 您收到的错误意味着 options 不支持下标,通常通过实现 __getitem__ 来实现。

因此,换句话说,您的选项位于:

options.optiona
options.optionb

而不是:

options['optiona']
options['optionb']

模板变量替换需要一个类似于 dict 的接口,因此它尝试使用后一种方法来查找 optiona 和 optionb。

按照 RoadieRich 在他的回答中建议的方式使用 vars 来使模板替换方法发挥作用。 或者,除非您确实需要 Template 对象,否则我建议使用简单的 print

print 'Option a is %s and option b is %s' % (options.optiona, options.optionb)

如果您认为命名字符串参数更好,您也可以结合使用这两种方法:

print 'Option a is %(optiona)s and option b is %(optionb)s' % vars(options)

OptionParser.parse_args returns an object with the option variable names as attributes, rather than as dictionary keys. The error you're getting means that options does not support subscripting, which it would normally do by implementing __getitem__.

So, in other words, your options are at:

options.optiona
options.optionb

Rather than:

options['optiona']
options['optionb']

Template variable substitution expects a dict-like interface, so it's trying to find optiona and optionb using the latter approach.

Use vars as RoadieRich suggests in his answer to make the template substitution approach work. Alternatively, unless you really need a Template object, I'd recommend using a simple print:

print 'Option a is %s and option b is %s' % (options.optiona, options.optionb)

You can also combine the two approaches if you feel that named string parameters are better:

print 'Option a is %(optiona)s and option b is %(optionb)s' % vars(options)
鹤舞 2024-07-26 07:53:05

以下似乎对我有用:

from string import Template
import optparse

def main():
    usage = "usage: %prog options outputname"
    p = optparse.OptionParser(usage)
    p.add_option('--optiona', '-a', default="")
    p.add_option('--optionb', '-b', default="")
    options, arguments = p.parse_args()
    t = Template('Option a is ${optiona} option b is ${optionb}')
    print t.substitute(vars(options)) #I'm assuming the uppercase S was a typo.

The following appears to work for me:

from string import Template
import optparse

def main():
    usage = "usage: %prog options outputname"
    p = optparse.OptionParser(usage)
    p.add_option('--optiona', '-a', default="")
    p.add_option('--optionb', '-b', default="")
    options, arguments = p.parse_args()
    t = Template('Option a is ${optiona} option b is ${optionb}')
    print t.substitute(vars(options)) #I'm assuming the uppercase S was a typo.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文