在类中的方法中使用方法中的选项(argparse)

时间:2015-09-25 22:22:26

标签: python class methods options argparse

我有一个带有 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个)

有人可以在这里帮助使用适当的代码结构,我可以在类中的所有方法中使用选项吗?或者在这种情况下更好的结构。

1 个答案:

答案 0 :(得分:1)

AttributeError: 'P' object has no attribute 'valueFromCommandLine'错误意味着您作为calc_score参数提供的内容与options参数不具有此属性。

但您没有告诉我们您如何调用此方法,甚至不知道如何创建P对象的方法。

calc_weightcalc_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标记这个(并在标题中使用它)但是没有给我们解析器定义?我怀疑optionsparser.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)