【问题标题】:the code says it is a error type but代码说这是一个错误类型,但是
【发布时间】:2014-10-27 01:17:45
【问题描述】:

我有这个代码。

#!/usr/bin/python

from optparse import OptionParser   #import the OptionParser object from this module

parser = OptionParser()

parser.add_option("-f", "--first", dest="meal", help="prix repas", type="float")  
parser.add_option("-s", "--second", dest="tip", help="le tip", type="float")
parser.add_option("-t", "--third", dest="tax", help="tax", type="float")


(options, args) = parser.parse_args() 

tax_value = options.meal * options.tax
meal_with_tax = tax_value + options.meal
tip_value = meal_with_tax * tip

if not (options.meal and options.tip): 
parser.error("You need to supply an argument for -s")

print "le prix du repas est '{}'.".format(options.meal)
print "Le tip est de '{}'.".format(options.tip)
print "Le tip est de '{}'.".format(options.tip)

每次我用下面的命令行运行它

./tip_re1_arg.py -s 5 2 3

我遇到了这个错误tax_value = options.meal * options.tax TypeError: unsupported operand type(s) for *: 'NoneType' and 'NoneType'

为什么?看来我在类型方面做的一切都是正确的。还是我?

抱歉,我是 Python 的初学者。

【问题讨论】:

  • 旁白:如果您正在编写新代码,您可能应该使用argparse 而不是optparse(原因here)。
  • 听听您认为-s 5 2 3 将如何由您的代码处理会很有趣。 5、2 和 3 中的哪一个应该是 meal 的值,哪个是 tax 的值?
  • 嗨 Chepner,我认为 optparse 会像 sys.argv 一样做出反应。不幸的是,事实并非如此。
  • 我在这里得到了这个练习docs.google.com/document/d/…

标签: python python-2.7


【解决方案1】:

您需要在运行时指定选项。换句话说:

./tip_re1_arg.py -f 5 -s 2 -t 3

解析器不会只接受 3 个未声明的选项并分配它们。现在,您可以通过直接使用输入参数数组(使用 sys.argv[1] 等)来使用它们而不使用标签。不过,与将参数更改为实际含义(即 -m/--meal、-x/--tax、-t/--tip)相比,这可能对用户不太友好。

无论如何,按照您的称呼方式,餐费和税费实际上并未分配,因此为空,从而给您 NoneType 错误。

【讨论】:

  • 顺便说一句,我必须分享,我的第一个没有减号的 python 问题!万岁!!!
【解决方案2】:

您已明确配置解析器以期望参数作为选项:

./tip_re1_arg.py -f 5 -s 2 -t 3

./tip_re1_arg.py --first 5 --second 2 --third 3

目前您的输入参数以args 结尾。

【讨论】:

  • 嗨 Bereal,您的回答更完整,但user3038802是最快的。非常感谢您向我展示了可以做什么,尤其是使用 --first
  • 顺便说一句,我必须分享,我的第一个没有减号的python问题!万岁!!!
猜你喜欢
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
  • 2015-05-27
  • 2018-11-21
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多