如何判断weather函数中使用的默认参数值?

how to determine weather the default parameter values are used in the function?

有两个函数:init 和 set_info。 (完整的视觉在最后显示)

class DefaultNode(object):

    def __init__(self, node_name, node_pre= None, node_next = None, 
act_func='sign', agg_func='sum', bias=0.0, response=1.0, node_type=None):
    ...

    def set_info(self, node_pre= None, node_next = None, act_func='sign', 
agg_func='sum', bias=0.0, response=1.0):
    ...

Set_info函数有很多默认参数值。我不想重写那些在初始化process.In中给出的参数,换句话说,如果要使用set_info设置其中一个参数,则其他参数应保持不变。

例如,

 temp_node = DefaultNode("givenname", node_pre = PRE) 
 temp_node.set_info("changedname")

temp_node的"node_pre"参数应该是"PRE"初始化的,而不是被函数"set_info"中的默认参数替换,即

node_temp.node_pre != sign

问题很简单,如何实现?

谢谢~

class DefaultNode(object):
    def __init__(self, node_name, node_pre= None, node_next = None, act_func='sign', agg_func='sum', bias=0.0, response=1.0, node_type=None):
        self.node_name = node_name
        self.node_pre = node_pre
        self.node_next = node_next
        self.act_func_name = act_func
        self.agg_func_name = agg_func
        if act_func == "sign":
            self.act_func = signmus_activation()

        if agg_func == 'sum':   # sign 和sum 是作为一个初始标记使用
            self.agg_func = sum
        self.bias = bias
        self.response = response
        self.node_type = node_type  

    def set_info(self, node_pre= None, node_next = None, act_func='sign', agg_func='sum', bias=0.0, response=1.0):
        self.node_pre = node_pre
        self.node_next = node_next        
        self.act_func_name = act_func
        self.agg_func_name = agg_func
        if act_func == "sign":
            self.act_func = signmus_activation()
        if agg_func == "sum":
            self.agg_func = sum
        self.bias = bias
        self.response = response

编辑 2:在您进一步澄清问题后更新了我的回复(谢谢!)。

选项 1:您可以使用 **kwargssetattr 来保持参数列表同步。例如,

class Example(object):

    def __init__(self):
        self.first = 1
        self.second = 2

    def set_info(self, **kwargs):
        for argument, value in kwargs.items():
            if not hasattr(self, argument):
                raise ValueError('invalid argument {}'.format(argument))
            setattr(self, argument, value)


# Usage
e = Example()
print(e.first, e.second)
e.set_info(first=1000, second=2000)
print(e.first, e.second)

# This would raise an exception
# e.set_info(some_random_attribute='blah')

这输出:

1 2
1000 2000

选项 2:您可以使用 @属性 和相应的 setter 来代替单独的方法来设置字段。例如,

class Properties(object):

    def __init__(self):
        self._thing = 10

    @property
    def thing(self):
        return self._thing

    @thing.setter
    def thing(self, t):
        self._thing = t


# Usage
p = Properties()
print(p.thing)
p.thing = 20
print(p.thing)

打印

10
20