如何判断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:您可以使用 **kwargs
和 setattr
来保持参数列表同步。例如,
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
有两个函数: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:您可以使用 **kwargs
和 setattr
来保持参数列表同步。例如,
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