【问题标题】:Using options (argparse) in method within a method within a class在类中的方法内的方法中使用选项(argparse)
【发布时间】:2015-09-25 22:22:26
【问题描述】:

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

TypeError: 'calc_weight' 只需要 1 个参数(给定 2 个)

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

【问题讨论】:

  • 我还在 python 中使用 -tt 运行了我的代码,以确保所有空格都正确缩进,这似乎不是问题
  • self.b = #计算浮点数的方法,使用字符串self.a(原始值)self.b右侧没有值
  • 您不会将选项存储在类实例中。也许使用 self.options 将其存储在 init 中?

标签: python class methods options argparse


【解决方案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 标记它(并在标题中使用它)但不给我们解析器定义?我怀疑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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多