首页 > 解决方案 > 具有 **kwargs 输出的类:未定义 arg

问题描述

我有一个有几个参数的类,它们有默认值。在程序中,有时类中使用的值会随着用户的输入而改变。

我已经考虑过以下方式。该类接受一个名为group_size(默认为 8)的整数,一个名为bounds(默认:True)的布尔值。有时,用户想要更改bounds并设置max_rank为用户提供的不同整数值。

我已经将我的班级定义如下:

class Society:

    def __init__(self, group_size=8, bounds=True, **kwargs):
        self.group_size = group_size

        if bounds == True:
            self.max_rank = group_size
        else:
            self.max_rank = max_rank

但是当我调用它来改变max_rank的值时,像这样:

S = Society(bounds=False, **{'max_rank': 10})

或像这样:

S = Society(bounds=False, max_rank=10)

我得到同样的错误NameError: name 'max_rank' is not defined。对于第一个错误,它指向同一行代码,而对于另一个错误,它指向我分配max_rank给的类内部self.max_rank

第一个错误:

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-124-d093fc631922> in <module>
----> 1 S = Society(bounds=False, **{max_rank: 10})

NameError: name 'max_rank' is not defined

第二个错误:

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-125-92d52166f851> in <module>
----> 1 S = Society(bounds=False, max_rank=10)

<ipython-input-123-ec1465ee15f1> in __init__(self, groups, group_size, b, c, fights_noise, up_rank, bounds, *args, **kwargs)
     49             self.max_rank = group_size
     50         else:
---> 51             self.max_rank = max_rank
     52 
     53 

NameError: name 'max_rank' is not defined

我是否必须(或者我可以)定义接受 **kwargs 的方式?喜欢他们会取的名字吗?也许当我实例化课程时,我以一种糟糕的方式通过了 kwargs。

标签: pythonclass

解决方案


你想max_rankkwargs字典中提取

if bounds == True:
    self.max_rank = group_size
else:
    #Extract max_rank out of kwargs
    max_rank = kwargs.get('max_rank')
    self.max_rank = max_rank

推荐阅读