我有一个带有 init 的课程和另外两个方法。在后两种方法中,是进行适当计算的其他方法。我想访问和使用命令行参数中的选项(使用argparse)。在类中的方法中使用方法时,使用选项的适当方法是什么? 我的代码结构是:
class P(object):
def __init__(self, a, options):
self.a = a
self.b = None
self.weight = None
self.score = None
self.Firstscore = None
def calc_score(self, options):
self.b = #Method to calculate a float, using the string self.a (raw value)
def calc_weight(self, options):
if float(self.b) > options.valueFromCommandLine:
self.b_weight == 0
else:
self.b_weight == 100
return self.b_weight
self.weight = (self.calc_weight(self.b))
self.score = self.weight * options.valueFromCommandLine
self.Firstscore = self.score * constant
return self.Firstscore
我继续得到 AttributeError:'P'对象没有属性'valueFromCommandLine'。
当我更改哪个方法调用选项时,我得到了 NameError:全局名称'b'未定义OR
TypeError:'calc_weight'正好取1个参数(给定2个)
有人可以在这里帮助使用适当的代码结构,我可以在类中的所有方法中使用选项吗?或者在这种情况下更好的结构。
答案 0 :(得分:1)
AttributeError: 'P' object has no attribute 'valueFromCommandLine'
错误意味着您作为calc_score
参数提供的内容与options
参数不具有此属性。
但您没有告诉我们您如何调用此方法,甚至不知道如何创建P
对象的方法。
calc_weight
是calc_score
中定义的函数。它不是P
方法。所以你可以用calc_weight(self, options)
来调用它。
我会把那部分重写为:
def calc_weight(b, value):
# no use for self here
if float(b) > value:
b_weight == 0
else:
b_weight == 100
return b_weight
self.weight = self.calc_weight(self.b, options.valueFromCommandLine)
您的问题不完整。理想情况下它应该是一个可运行的剪辑 - 我们可以剪切和粘贴,即使产生错误信息。
为什么用argparse
标记这个(并在标题中使用它)但是没有给我们解析器定义?我怀疑options
是parser.parse_args()
调用的结果,但是没有看到解析器定义或命令行,我无法确定。
您甚至可以定义calc_score
仅使用value
,而不是整个options
对象(就像我对calc_weight
所做的那样)。这看起来就像您在这里使用options
的唯一属性。
这大致是我期望工作代码看起来像:
import argparse
# P definition can be imported without running
class P(object):
....
if __name__ == '__main__':
# block used when called as a script
parser = argparse.ArgumentParser()
parser.add_argument('value', type=int, help='command line positional argument')
# type=int because it will be used later in a numeric comparison
....
args = parser.parse_args()
p = P('10') # P with a=`10` string
print(p.calc_score(, args.value))
# or p.calc_score(args)